用于字节数组的Java Comparator(字典)

我有一个带有byte []键的hashmap。 我想通过TreeMap对其进行排序。

为字典顺序实施比较器的最有效方法是什么?

使用Guava ,您可以使用以下任何一种:

  • UnsignedBytes.lexicographicalComparator()
  • SignedBytes.lexicographicalComparator()

UnsignedBytes比较器似乎具有使用Unsafe的优化forms,如果可以的话。 代码中的注释表明它可能至少是普通Java实现的两倍。

在Apache Hbase中找到了这段很好的代码:

  public int compare(byte[] left, byte[] right) { for (int i = 0, j = 0; i < left.length && j < right.length; i++, j++) { int a = (left[i] & 0xff); int b = (right[j] & 0xff); if (a != b) { return a - b; } } return left.length - right.length; } 

我假设问题只是“字节与字节”比较。 处理数组很简单,所以我不会介绍它。 关于字节与字节,我的第一个想法是这样做:

 public class ByteComparator implements Comparator { public int compare(byte b1, byte b2) { return new Byte(b1).compareTo(b2); } } 

但这不会是字典:0xFF(-1的有符号字节)将被认为小于0x00,当按字典顺序它更大。 我认为这应该做的伎俩:

 public class ByteComparator implements Comparator { public int compare(byte b1, byte b2) { // convert to unsigned bytes (0 to 255) before comparing them. int i1 = b1 < 0 ? 256 + b1 : b1; int i2 = b2 < 0 ? 256 + b2 : b2; return i2 - i1; } } 

可能在Apache的commons-lang或commons-math库中有一些东西可以做到这一点,但我不知道它在手边。

你可以使用一个比较器,它比较数组中每个字节的Character.toLowerCase()(假设byte []是ASCII)如果不是你需要自己进行字符解码或者使用new String(bytes, charSet).toLowerCase()但这不太可能有效。