【问题标题】:Check if a list of byte arrays contains a new byte array检查字节数组列表是否包含新的字节数组
【发布时间】:2019-08-13 10:19:07
【问题描述】:

我有一个字节数组列表,需要检查这个列表是否包含新的给定字节数组。如果没有,那么我需要执行一些操作。

现在,我正在尝试这样做:

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

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

这对我不起作用,它无论如何都会在 if 语句中执行 some action

我做错了什么以及检查它的正确方法是什么?

提前谢谢你。

【问题讨论】:

  • 当然可以。。您的列表不包含newByteArray
  • 一个数组只等于它自己。所以你的列表不可能包含newByteArray(除非newByteArray不是一个新的字节数组,而是存储在列表中的数组之一)。您需要遍历列表并比较字节数组的内容docs.oracle.com/javase/8/docs/api/java/util/…
  • @JBNizet 是的,你是对的。我必须比较内容。谢谢!

标签: java arrays list collections byte


【解决方案1】:

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
}

【讨论】:

  • 为什么你使用Boolean 对象而不是直接的boolean 值?
  • @Holger 纯粹的习惯力量,在这里毫无用处。我会编辑它。
【解决方案2】:

你可以试试这个

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

    // do some action
}

【讨论】:

  • 可以这样修改: if (bytesPhotosInCloud .stream() .noneMatch(byteArray -> Arrays.equals(byteArray, bytesImage))){ //do some action } 谢谢。跨度>
【解决方案3】:

List.contains 方法使用equals 检查列表是否包含特定元素。 来自javadoc

如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e 满足 Objects.equals(o, e) 时才返回 true。

但对于数组,equals 方法与== 相同。这就是为什么 contains 即使内容相同也会返回 false 的原因。请改用Arrays.equals

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

    }
}

【讨论】:

    【解决方案4】:

    您正在寻找:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多