在具有整数数组的数组列表上使用包含

2022-09-03 06:26:26

我有一个 ,我向它添加一个数组。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);

...但是,即使已添加到列表中,这将返回 false,并且包含与 完全相同的数组。wwt

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


答案 1

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

您可能想要一个 ArrayList of ArrayLists。

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.

答案 2

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

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

因此,您必须循环访问列表并使用Arrays.equals(int[],int[])检查所有条目。下面是执行此操作的帮助程序方法:

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
}