С Long.compareUnsigned
(и другими методами, которые обрабатывают long
s как беззнаковые), битовые трюки больше не нужны. Вы можете просто реализовать стандартное многоэлементное сравнение, где более значимые значения обрабатываются первыми.
Вы должны использовать long
с вместо int
с, так как это значительно сократит работу, выполняемую 64-битными ЦП, но не будет иметь большой разницы для 32-битных ЦП.
Для compareTo
с long[]
с прямым порядком байтов:
public static int keyCompareTo(final long[] a, final long[] b) {
final int highComp = Long.compareUnsigned(a[1], b[1]);
if (highComp != 0) return highComp;
else return Long.compareUnsigned(a[0], b[0]);
}
Или с объектом:
public class Key implements Comparable<Key> {
final protected long high;
final protected long low;
public int compareTo(final Key other) {
if (other == null) throw new NullPointerException();
final int highComp = Long.compareUnsigned(a.high, b.high);
if (highComp != 0) return highComp;
else return Long.compareUnsigned(a.low, b.low);
}
}
Для равенства:
a[0] == b[0] && a[1] == b[1]
a.high == b.high && a.low == b.low
Для менее чем:
final int highComp = Long.compareUnsigned(a[1], b[1]);
final boolean lessThan = highComp < 0 || (highComp == 0 && Long.compareUnsigned(a[0], b[0]) < 0);
final int highComp = Long.compareUnsigned(a.high, b.high);
final boolean lessThan = highComp < 0 || (highComp == 0 && Long.compareUnsigned(a.low, b.low) < 0);