如何找到int []的ArrayList是否包含int []

时间:2014-02-23 14:46:32

标签: java arrays arraylist int contains

我的ArrayList包含int[]

假设Arrays.equals(int[], (a value in the arrayList)) = true

为什么我这样做arrayOfInts.contains(int[])这是假的?

我认为是因为(int[] == (a value in the arrayList)) = false的原因相同,但是我应该收到此错误吗?

我能以某种方式纠正它吗?

TL; DR:我可以将Arraylist.contains()用于int []


编辑:

答案(如果有人将来在这里搜索我作为解决方案的比较代码):

private boolean arraylistContains(int[] comparison, ArrayList<int[]> arrayListToCompare){
    for(int[] values: arrayListToCompare){
        if (Arrays.equals(comparison, values)){
            return true;
        }
    }
    return false;
}

4 个答案:

答案 0 :(得分:8)

数组列表仅存储对数组的引用,而不存储其内容,因此contains()只能说,如果列表包含对您输入的数组的确切引用。它不评估数组的内容。

如果需要检查,如果列表包含具有特定值的数组,则必须遍历列表并使用Arrays.equals(arr1, arr2)

答案 1 :(得分:1)

不幸的是,你不能。我可能会将数组包装在另一个对象中,然后将其放入列表中。像(完全未经测试)的东西:

public class IntArrayWrapper {
    private final int[] intArray;
    public IntArrayWrapper(int[] intArray) {
        this.intArray = intArray;
    }
    @Override
    public int hashCode() {
        return Arrays.hashCode(intArray);
    }
    @Override
    public boolean equals(Object other) {
        return other instanceof IntArrayWrapper && Arrays.equals(this.intArray, ((IntArrayWrapper) other).intArray);
    }
}

然后,如果您决定将来使用HashSet替换ArrayList,那么它将很简单(并且您可能会获得一些不错的性能提升)。

答案 2 :(得分:0)

你不能因为

    int[] a = { 1,2,3 };
    int[] b = { 1,2,3 };
    List<int[]> list = new ArrayList<int[]>();
    list.add(a);
    list.contains(b); // is false

a不等于b ,这意味着a.equals(b)将返回false。方法Collection.contans(Object)正在使用equals来检查abject是否已存在于集合中。因此,如果a.equals(b)false,即使它们看起来相同,也会得到该数组不在集合中。

有一个例外。如果它们实际上是同一个对象contains将返回true。见下文:

    int[] a = { 1,2,3 };
    List<int[]> list = new ArrayList<int[]>();
    list.add(a);
    list.contains(a); // is true

答案 3 :(得分:0)

参考 - &gt; https://stackoverflow.com/a/106351/1897935

ArrayList<Object> list = ...;
for (Object o : list) {
        if (o.getClass().equals(Integer.TYPE)) {
            handleInt((int)o);
        }
        else if (o.getClass().equals(String.class)) {
            handleString((String)o);
        }
        ...
    }