字节数组的Java比较器(字典)
我有一个带有byte[]键的hashmap。我想用树形图把它分类字节数组的Java比较器(字典),java,sorting,collections,map,compare,Java,Sorting,Collections,Map,Compare,我有一个带有byte[]键的hashmap。我想用树形图把它分类 实现字典顺序比较器的最有效方法是什么?您可以使用比较器来表示数组中每个字节的字符.toLowerCase()(假设字节[]为ASCII格式),否则您需要自己进行字符解码或使用新字符串(字节,字符集)。toLowerCase()但这不太可能是有效的。我假设问题只是在于“字节与字节”的比较。处理数组很简单,所以我不赘述。关于byte vs.byte,我的第一个想法是: public class ByteComparator imple
实现字典顺序比较器的最有效方法是什么?您可以使用比较器来表示数组中每个字节的字符.toLowerCase()(假设字节[]为ASCII格式),否则您需要自己进行字符解码或使用
新字符串(字节,字符集)。toLowerCase()
但这不太可能是有效的。我假设问题只是在于“字节与字节”的比较。处理数组很简单,所以我不赘述。关于byte vs.byte,我的第一个想法是:
public class ByteComparator implements Comparator<byte> {
public int compare(byte b1, byte b2) {
return new Byte(b1).compareTo(b2);
}
}
公共类字节比较器实现比较器{
公共整数比较(字节b1,字节b2){
返回新字节(b1),与(b2)比较;
}
}
但这不会是字典式的:0xFF(1的有符号字节)将被视为小于0x00,而在字典式上它更大。我认为这应该起作用:
public class ByteComparator implements Comparator<byte> {
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;
}
}
公共类字节比较器实现比较器{
公共整数比较(字节b1,字节b2){
//比较前,请先转换为无符号字节(0到255)。
inti1=b1<0?256+b1:b1;
inti2=b2<0?256+b2:b2;
返回i2-i1;
}
}
Apache的commons lang或commons math库中可能有这样的功能,但我现在还不知道。使用,您可以使用以下任一功能:
UnsignedBytes
比较器似乎有一个使用Unsafe
的优化表单,如果可以,它会使用该表单。代码中的注释表明,它的速度可能至少是普通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;
}
公共整数比较(字节[]左,字节[]右){
对于(int i=0,j=0;iUnsignedBytes.lexicographicalComparator()
所做的。嗯,当一个变量足够时,他们为什么要使用i
和j
。此外,存储int length=Math.min(left.length,right.length)
并比较i
将改善大型阵列的这一点。您可能会期望阵列的长度字段将与“Java”中的解决方案一样昂贵。如果是这样,请发布一个工作示例。正如科林在对我的回答的评论中所说,我的解决方案与番石榴中的非优化方案相同。因此,您可以直接使用我的,这是一个工作的例子,或遵循科林的链接。