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

kam*_*lot 12 java arrays contains arraylist

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

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

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

int[] t = {1,2};
return j.contains(t);
Run Code Online (Sandbox Code Playgroud)

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

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

Cle*_*t P 9

数组只能与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.
Run Code Online (Sandbox Code Playgroud)


Sea*_*oyd 9

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

// from Object.class
public boolean equals(Object obj) {
return (this == obj);
}
Run Code Online (Sandbox Code Playgroud)

所以你必须迭代列表并使用查看所有条目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;
}
Run Code Online (Sandbox Code Playgroud)

更新:自从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
}
Run Code Online (Sandbox Code Playgroud)