是一个2d字节数组中的字节数组?

时间:2015-10-08 04:17:57

标签: java

我有一个字节数组:

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

检查checkcheck2中的ARRAYARRAY是否完全按照书写方式(以相同的顺序等)进行检查的最佳方法是什么?

我可以根据需要将check更改为任何其他数据结构,但check2positive_comment(Person,Book). negative_comment(Person,Book). 作为字节数组提供。

3 个答案:

答案 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循环。