问题 在包含整数数组的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
答案:
数组只能与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
这里的问题是数组不会覆盖 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
如果它们具有相同的对象引用,则两个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