package com.carrotsearch.hppc.sorting;
import java.util.Comparator;
Compare objects at two given indices and return the result of their comparison consistent with Comparator
's contract.
Beware of the return (int - int) idiom
, it is usually
broken if arbitrary numbers can appear on input. Use regular comparison
operations - they are very fast anyway.
/**
* Compare objects at two given indices and return the result of their
* comparison consistent with {@link Comparator}'s contract.
* <p>
* <b>Beware of the <code>return (int - int) idiom</code></b>, it is usually
* broken if arbitrary numbers can appear on input. Use regular comparison
* operations - they are very fast anyway.
*/
public interface IndirectComparator {
See class documentation.
/**
* See class documentation.
*/
public int compare(int indexA, int indexB);
A natural-order comparator for integers.
/**
* A natural-order comparator for integers.
*/
public static class AscendingIntComparator implements IndirectComparator {
private final int[] array;
public AscendingIntComparator(int[] array) {
this.array = array;
}
public int compare(int indexA, int indexB) {
final int a = array[indexA];
final int b = array[indexB];
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
}
A reverse-order comparator for integers.
/**
* A reverse-order comparator for integers.
*/
public static class DescendingIntComparator extends AscendingIntComparator {
public DescendingIntComparator(int[] array) {
super(array);
}
public final int compare(int indexA, int indexB) {
return -super.compare(indexA, indexB);
}
}
A natural-order comparator for integers.
/**
* A natural-order comparator for integers.
*/
public static class AscendingShortComparator implements IndirectComparator {
private final short[] array;
public AscendingShortComparator(short[] array) {
this.array = array;
}
public int compare(int indexA, int indexB) {
final short a = array[indexA];
final short b = array[indexB];
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
}
A reverse-order comparator for shorts.
/**
* A reverse-order comparator for shorts.
*/
public static class DescendingShortComparator extends AscendingShortComparator {
public DescendingShortComparator(short[] array) {
super(array);
}
public final int compare(int indexA, int indexB) {
return -super.compare(indexA, indexB);
}
}
A natural-order comparator for doubles.
/**
* A natural-order comparator for doubles.
*/
public static class AscendingDoubleComparator implements IndirectComparator {
private final double[] array;
public AscendingDoubleComparator(double[] array) {
this.array = array;
}
public int compare(int indexA, int indexB) {
final double a = array[indexA];
final double b = array[indexB];
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
}
A reverse-order comparator for doubles.
/**
* A reverse-order comparator for doubles.
*/
public static class DescendingDoubleComparator extends AscendingDoubleComparator {
public DescendingDoubleComparator(double[] array) {
super(array);
}
public final int compare(int indexA, int indexB) {
return -super.compare(indexA, indexB);
}
}
A natural-order comparator for floats.
/**
* A natural-order comparator for floats.
*/
public static class AscendingFloatComparator implements IndirectComparator {
private final float[] array;
public AscendingFloatComparator(float[] array) {
this.array = array;
}
public int compare(int indexA, int indexB) {
final float a = array[indexA];
final float b = array[indexB];
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
}
A reverse-order comparator for floats.
/**
* A reverse-order comparator for floats.
*/
public static class DescendingFloatComparator extends AscendingFloatComparator {
public DescendingFloatComparator(float[] array) {
super(array);
}
public final int compare(int indexA, int indexB) {
return -super.compare(indexA, indexB);
}
}
A delegating comparator for object types.
/**
* A delegating comparator for object types.
*/
public final static class DelegatingComparator<T> implements IndirectComparator {
private final T[] array;
private final Comparator<? super T> delegate;
public DelegatingComparator(T[] array, Comparator<? super T> delegate) {
this.array = array;
this.delegate = delegate;
}
public final int compare(int indexA, int indexB) {
return delegate.compare(array[indexA], array[indexB]);
}
@Override
public String toString() {
return this.getClass().getSimpleName() + " -> " + delegate;
}
}
}