2011-02-24 36 views

回答

19

使用Guava,您可以使用的:

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

+0

做我们在“Java”的解决方案,如果是的话请张贴工作的例子。 – Deepak 2011-02-25 09:57:38

+0

作为ColinD在我的答案评述中说,我的解决办法是一样的优化一个番石榴非。所以你可以直接使用我的,这是一个工作的例子,或者按照ColinD的链接。 – marcorossi 2011-02-25 12:53:19

-2

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

-1

我假设的问题就是与“与字节一个字节”的比较。处理数组非常简单,所以我不会介绍它。对于字节对字节,我首先想到的是要做到这一点:

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

但是,这不会是字典:0xFF的(为-1的符号字节)将被视为小于0×00,当字典序是大。我想这应该做的伎俩:

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; 
    } 
} 

大概有东西在Apache的公地郎或做这个公地数学库,但我不知道它关闭的手。

15

发现这个漂亮的代码在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; 
    } 
+0

这基本上就是番石榴的'UnsignedBytes.lexicographicalComparator()的非优化版本'做。 – ColinD 2011-02-24 18:25:13

+1

嗯,当一个变量足够时,他们为什么要使用'i'和'j'。此外,存储'INT长度= Math.min(left.length,right.length)'和比较'I 2013-01-09 14:05:34

+0

你会期望的是,阵列的长度字段将是昂贵 – marcorossi 2013-05-03 15:25:10