如何比较两个java数组的前n个字节?

时间:2014-10-24 10:44:16

标签: java arrays

我需要比较两个不同的java byte []数组的前n个字节。有一个Arrays equals()函数,但它首先测试数组的长度,然后测试两个arays的整个长度和我的数组是不同的长度,这样就不好了。

除了手工编写自己的循环之外还有什么想法吗?

谢谢,

3 个答案:

答案 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));

通过java.util.Arrays.equals() with limited length