Проверьте, содержит ли список байтовых массивов новый байтовый массив - PullRequest
1 голос
/ 22 марта 2019

У меня есть список байтовых массивов, и мне нужно проверить, не содержит ли этот список новый заданный байтовый массив. Если нет, то мне нужно выполнить какое-то действие.

Прямо сейчас я пытаюсь сделать это так:

List<byte[]> listOFByteArrays = getListOfByteArrays();
byte[] newByteArray = getNewByteArray();

if (!listOfByteArrays.contains(newByteArray)){
// do some action
}

Это не работает для меня, оно все равно выполняет это some action в операторе if.

Что я делаю не так и как правильно это проверить?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 22 марта 2019

Вы можете попробовать это

if (!listOFByteArrays
    .stream()
    .anyMatch(byteArray -> Arrays.areEqual(byteArray, newByteArray))) {

    // do some action
}
1 голос
/ 22 марта 2019

List.contains метод используется equals, чтобы проверить, содержит ли список определенный элемент.From javadoc :

Возвращает true, если этот список содержит указанный элемент.Более формально, возвращает true, если и только если этот список содержит хотя бы один элемент e, такой что Objects.equals (o, e).

Но для массивов метод equals такой же, как ==.Вот почему contains возвращает false, даже если содержимое одинаково.Используйте Arrays.equals вместо:

for (byte[] arr : listOfByteArrays) {
    if (Arrays.equals(arr, newByteArray )) {

    }
}
1 голос
/ 22 марта 2019

Java .contains(T) просто выполняет проверку на равенство аргумента. Массив, однако, не равен другому массиву, содержащему те же значения, потому что все значения не проверяются, и сравнение выполняется по их указателям.

Поскольку у вас уже есть два byte[], ужасный, но функциональный способ может состоять в том, чтобы просто ... перебирать список и использовать java.util.Arrays.equals(), который творит чудеса на примитивных массивах.

List<byte[]> listOFByteArrays = getListOfByteArrays();
byte[] newByteArray = getNewByteArray();
boolean flag = false;

for(byte[] b : listOFByteArrays) {
    if(Arrays.equals(b,newByteArray)) { 
       flag = true; 
       break;
    }
}

if (!flag){
   // do stuff
}
0 голосов
/ 22 марта 2019

Вы ищете:

for (int i = 0; i < listOfByteArrays.size(); i++) {
    if (Arrays.equals(newByteArray, listOfByteArrays.get(i))) {
        //do some action
    }
}
...