Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字节数组的Java比较器(字典)_Java_Sorting_Collections_Map_Compare - Fatal编程技术网

字节数组的Java比较器(字典)

字节数组的Java比较器(字典),java,sorting,collections,map,compare,Java,Sorting,Collections,Map,Compare,我有一个带有byte[]键的hashmap。我想用树形图把它分类 实现字典顺序比较器的最有效方法是什么?您可以使用比较器来表示数组中每个字节的字符.toLowerCase()(假设字节[]为ASCII格式),否则您需要自己进行字符解码或使用新字符串(字节,字符集)。toLowerCase()但这不太可能是有效的。我假设问题只是在于“字节与字节”的比较。处理数组很简单,所以我不赘述。关于byte vs.byte,我的第一个想法是: public class ByteComparator imple

我有一个带有byte[]键的hashmap。我想用树形图把它分类


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

您可以使用比较器来表示数组中每个字节的字符.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;i这基本上就是Guava的非优化版本的
UnsignedBytes.lexicographicalComparator()
所做的。嗯,当一个变量足够时,他们为什么要使用
i
j
。此外,存储
int length=Math.min(left.length,right.length)
并比较
i
将改善大型阵列的这一点。您可能会期望阵列的长度字段将与“Java”中的解决方案一样昂贵。如果是这样,请发布一个工作示例。正如科林在对我的回答的评论中所说,我的解决方案与番石榴中的非优化方案相同。因此,您可以直接使用我的,这是一个工作的例子,或遵循科林的链接。