我的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;
}
答案 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);
}
...
}