问题 在包含整数数组的ArrayList上使用contains


我有一个 ArrayList<int[]>,我添加一个数组。

ArrayList<int[]> j = new ArrayList<int[]>();
int[] w = {1,2};
j.add(w);

假设我想知道是否 j 包含一个数组 {1,2} 在它没有使用 w因为我将从另一个班级调用它。所以,我创建了一个新的数组 {1,2} 在里面...

int[] t = {1,2};
return j.contains(t);

......但即使这样也会返回假 w 被添加到列表中,并且 w 包含完全相同的数组 t

有没有办法使用包含这样我只能检查,看看是否有一个元素 ArrayList 有数组值 {1,2}


3450
2018-01-31 08:57


起源



答案:


数组只能与Arrays.equals()进行比较。

您可能需要ArrayList的ArrayList。

ArrayList<ArrayList<Integer>> j = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> w = new ArrayList<Integer>();
w.add(1); w.add(2);
j.add(w);
ArrayList<Integer> t = new ArrayList<Integer>();
t.add(1); t.add(2);
return j.contains(t); // should return true.

8
2018-01-31 09:02



遗憾的是,这并不能解决真正的问题。如果 w 有 1,2,3? - Mark Peters
我认为用户想要比较精确的数组,他没有提到数组的一部分。 - Clement P
你是对的,也许我误解了。 - Mark Peters


答案:


数组只能与Arrays.equals()进行比较。

您可能需要ArrayList的ArrayList。

ArrayList<ArrayList<Integer>> j = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> w = new ArrayList<Integer>();
w.add(1); w.add(2);
j.add(w);
ArrayList<Integer> t = new ArrayList<Integer>();
t.add(1); t.add(2);
return j.contains(t); // should return true.

8
2018-01-31 09:02



遗憾的是,这并不能解决真正的问题。如果 w 有 1,2,3? - Mark Peters
我认为用户想要比较精确的数组,他没有提到数组的一部分。 - Clement P
你是对的,也许我误解了。 - Mark Peters


这里的问题是数组不会覆盖 Object.equals(Object),因此两个列表条目之间的比较发生在默认的equals()实现中

// from Object.class
public boolean equals(Object obj) {
return (this == obj);
}

因此,您必须遍历列表并使用检查所有条目 Arrays.equals(int[], int[])。这是一个Helper方法,它执行此操作:

public static boolean isInList(
    final List<int[]> list, final int[] candidate){

    for(final int[] item : list){
        if(Arrays.equals(item, candidate)){
            return true;
        }
    }
    return false;
}

更新: 从Java 8开始,这已经变得更加简单了:

public static boolean isInList(
        final List<int[]> list, final int[] candidate) {

    return list.stream().anyMatch(a -> Arrays.equals(a, candidate));
            //  ^-- or you may want to use .parallelStream() here instead
}

8
2018-01-31 09:05





您需要遍历列表并手动检查数组是否符合您的条件。

public static boolean containsSubArray(List<int[]> j, int[] sub) {
   for ( int[] arr : j ) {
      if (arr contains elements of sub) {
         return true;
      }
   }
   return false;
}

如果你想要完全匹配,你可以使用 Arrays.equals()。我不认为有一个库函数可以在数组中包含所有内容,所以你必须自己编写,如果这是你想要的。


0
2018-01-31 09:00





“包含”合同检查是否平等。所以在你的情况下失败的是int []的相等。以来 Array 不会覆盖equals方法 Object 您需要一种解决方法来检查遏制。

如果你需要检查遏制 Array 那么你别无选择,只能遍历ArrayList并自己进行比较。


0
2018-01-31 09:11





来自java api:

public boolean contains(Object o)

如果此列表包含,则返回true   指定的元素。更正式的,   当且仅当此列表返回true   包含至少一个元素e   那 (o==null ? e==null : o.equals(e))

以来 int[] 是一个原始的,我很确定没有.equals方法存在所以它我的猜测总是会返回false。

我建议采用不同的方式存储数据?也许带着某种钥匙?


0
2018-01-31 09:04



int[] 实际上并不是原始的。所有阵列都是 Object 并继承其实现 equals()如果操作数相同,则返回true 例 (==) - Mark Peters
int []不是原始的。 int是。 int []扩展了Object,但没有覆盖 equals() - Sean Patrick Floyd
啊,我的b。我试图得到它不会覆盖equals()方法的事实,因此不能用于包含。 - eosgood


如果它们具有相同的对象引用,则两个java数组数组相等。内容无关紧要。

您正在寻找一种方法来检查它们是否具有相同的内容。这有助于:

 Arrays.equals(new int[]{1,2}, new int[]{1,2});   // evaluates to true
 Arrays.equals(new int[]{1,2}, new int[]{2,1});   // evaluates to false (!)

如果顺序不应影响相等性,那么您必须自己实现静态equals方法。


0
2018-01-31 09:13





首先它们不是相同的Object引用,所以它们不相等。 equals()将返回false。 根据您的情况,您需要实现一种方法来自己比较它们。


0
2018-01-31 10:36