我有一个字节数组:
private final static byte[][] ARRAY = {
{ (byte) 0xaa, (byte) 0xbb, (byte) 0xcc, (byte) 0xdd },
{ (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44 }
};
给定一个任意字节数组:
byte[] check = { (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44) };
或
byte[] check2 = { (byte) 0x12, (byte) 0x23, (byte) 0x34, (byte) 0x45) };
检查check
或check2
中的ARRAY
或ARRAY
是否完全按照书写方式(以相同的顺序等)进行检查的最佳方法是什么?
我可以根据需要将check
更改为任何其他数据结构,但check2
和positive_comment(Person,Book).
negative_comment(Person,Book).
作为字节数组提供。
答案 0 :(得分:1)
您可以使用Arrays.equals()
来比较两个数组。来自javadoc:
如果两个指定的字节数组等于1,则返回true 另一个。如果两个数组都包含,则认为两个数组相等 相同数量的元素,以及所有相应的元素对 这两个数组相等。
byte[] check = { (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44 };
byte[] check2 = { (byte) 0x12, (byte) 0x23, (byte) 0x34, (byte) 0x45 };
int i = 0;
for (; i < ARRAY.length; i++) {
if (Arrays.equals(ARRAY[i], check)) {
System.out.println("check[] found at index: " + i);
break;
}
}
if (i == ARRAY.length) {
System.out.println("check[] not found");
}
for (i = 0; i < ARRAY.length; i++) {
if (Arrays.equals(ARRAY[i], check2)) {
System.out.println("check2[] found at index: " + i);
break;
}
}
if (i == ARRAY.length) {
System.out.println("check2[] not found");
}
输出:
check[] found at index: 1
check2[] not found
答案 1 :(得分:1)
使用byte []包装类和HashSet。
在包装器类中使用equals()
和hashCode()
覆盖Arrays.equals(byte[],byte[])
和Arrays.hashCode(byte[])
,然后HashSet将匹配具有完全相同元素的其他字节数组。
public static void main(String[] args) {
Set<MyArray> ARRAY_SET = new HashSet<MyArray>();
ARRAY_SET.add(new MyArray(new byte[] { (byte) 0xaa, (byte) 0xbb,
(byte) 0xcc, (byte) 0xdd }));
ARRAY_SET.add(new MyArray(new byte[] { (byte) 0x11, (byte) 0x22,
(byte) 0x33, (byte) 0x44 }));
byte[] check = { (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44 };
byte[] check2 = { (byte) 0x12, (byte) 0x23, (byte) 0x34, (byte) 0x45 };
System.out.println(ARRAY_SET.contains(new MyArray(check)));//true
System.out.println(ARRAY_SET.contains(new MyArray(check2)));//false
}
static class MyArray {
private byte[] array;
public MyArray(byte[] array) {
super();
this.array = array;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(array);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyArray other = (MyArray) obj;
if (!Arrays.equals(array, other.array))
return false;
return true;
}
}
答案 2 :(得分:0)
您可以使用Arrays.equals
方法。
Arrays.equals(arr1, arr2)
将返回true
。
在Java 8中,查看byte[][]
是否包含特定byte[]
arr
的相当不错的方法是
Stream.of(ARRAY).filter(j -> Arrays.equals(arr, j)).findAny().isPresent();
在Java 8之前,您必须使用for
循环。