我需要比较两个不同的java byte []数组的前n个字节。有一个Arrays equals()函数,但它首先测试数组的长度,然后测试两个arays的整个长度和我的数组是不同的长度,这样就不好了。
除了手工编写自己的循环之外还有什么想法吗?
谢谢,
答案 0 :(得分:4)
为什么你不想手工编写自己的循环?您只需Arrays即可复制subset,然后再次使用compare: -
byte[] a1 = Arrays.copyOfRange(array1, 0, n);
byte[] a2 = Arrays.copyOfRange(array2, 0, n);
boolean equal = Arrays.equals(a1, a2);
如果效率是一个问题,那么System.arraycopy是一种更快但更冗长的复制数组的方式。
如果效率确实是一个问题而且冗长度不高,那么循环可能是最佳方式。
boolean matched = true;
for (int i=0; i<n; i++){
if (array1[i] != array2[i]) {
matched = false;
break;
}
}
这是因为您可以在看到不匹配的字节后立即停止搜索。如果第一个字节不匹配,我们正在比较100个字节,在第一个解决方案中,在后台我们复制2个100个字节,创建两个100字节的数组,然后比较100个字节集,尽管它会停在第一个。在循环中,这是循环的一次迭代,发现不匹配,标记并完成。
Java 8 (更新)
通过创建Stream索引号进行比较(使用IntStream)并在流上执行allMatch,可以更简洁地在Java 8语法中完成上述相同的操作使用Predicate比较流中每个索引的两个数组,如下所示: -
//Both arrays must match at all indices between 0 and n
boolean matched = IntStream.range(0, n).allMatch(i -> array1[i] == array2[i]);
//...Of course if you are comparing non simple types, you would need to use equals()
答案 1 :(得分:2)
您可以将每个数组的前n个元素复制到新数组中,并对这些数组使用Arrays.equals()。
byte[] a = {1, 2, 3, 4};
byte[] b = {1, 2, 3, 4, 5, 6};
byte[] aCopy = new byte[3];
System.arraycopy(a, 0, aCopy, 0, aCopy.length);
byte[] bCopy = new byte[3];
System.arraycopy(b, 0, bCopy, 0, bCopy.length);
boolean equal = Arrays.equals(aCopy, bCopy);
详细,但它会做你想要的。或者,只需从0..n
循环boolean equal = true;
for (int i = 0; equal && i < 3; i++) {
equal = a[i] == b[i];
}
答案 2 :(得分:0)
这是使用java.nio.ByteBuffer.wrap()的更有效的解决方案,它避免了中间复制操作:
ByteBuffer.wrap(array1, 0, n).equals(ByteBuffer.wrap(array2, 0, n));