回答
使用Guava,您可以使用的:
的UnsignedBytes
比较似乎有使用Unsafe
它使用的,如果它可以优化的形式。代码中的注释表明它可能至少是普通Java实现的两倍。
您可以使用一个比较器来使数组中的每个字节的Character.toLowerCase()失效(假设byte []是ASCII码)如果不是,您需要自己进行字符解码或使用new String(bytes, charSet).toLowerCase()
这不太可能是有效的。
我假设的问题就是与“与字节一个字节”的比较。处理数组非常简单,所以我不会介绍它。对于字节对字节,我首先想到的是要做到这一点:
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的公地郎或做这个公地数学库,但我不知道它关闭的手。
发现这个漂亮的代码在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;
}
这基本上就是番石榴的'UnsignedBytes.lexicographicalComparator()的非优化版本'做。 – ColinD 2011-02-24 18:25:13
嗯,当一个变量足够时,他们为什么要使用'i'和'j'。此外,存储'INT长度= Math.min(left.length,right.length)'和比较'I
你会期望的是,阵列的长度字段将是昂贵 – marcorossi 2013-05-03 15:25:10
- 1. 爪哇字符串比较
- 2. 阵列字典比较
- 3. 逆阵列(爪哇)// Invertir阵列(爪哇)
- 4. 爪哇 - 双比较
- 5. 爪哇较长的文字
- 6. 爪哇 - 在阵列计数数字
- 7. 爪哇 - 比较算法
- 8. 爪哇JSON阵列
- 9. 爪哇:从阵列
- 10. prepareForSegue比较来自阵列和字典
- 11. 比较基于字典
- 12. 爪哇复杂阵列
- 13. 爪哇 - 从双阵列
- 14. 爪哇,页通过阵列
- 15. 爪哇 - 打印阵列
- 16. 爪哇System.out.format双阵列
- 17. 爪哇3D阵列赋值
- 18. 爪哇 - 排序只阵列
- 19. 爪哇 - 改变阵列
- 20. 爪哇 - 阵列的子类
- 21. 比较字典列表
- 22. 比较列表和字典
- 23. 比较字典
- 24. 爪哇 - 可比
- 25. 爪哇 - 字节的字符串到字节[]
- 26. SKSprite节点字典/阵列
- 27. 爪哇的InputStream的read(字节[])方法
- 28. 爪哇字符串转换为日期,然后比较
- 29. 爪哇 - 字符串中的许多比较txt文件
- 30. 爪哇 - 比较两个字符串列表,并创建新的列表
做我们在“Java”的解决方案,如果是的话请张贴工作的例子。 – Deepak 2011-02-25 09:57:38
作为ColinD在我的答案评述中说,我的解决办法是一样的优化一个番石榴非。所以你可以直接使用我的,这是一个工作的例子,或者按照ColinD的链接。 – marcorossi 2011-02-25 12:53:19