Java 在带有整数数组的ArrayList上使用contains
我有一个Java 在带有整数数组的ArrayList上使用contains,java,arrays,arraylist,contains,Java,Arrays,Arraylist,Contains,我有一个ArrayList,我向其中添加了一个数组 ArrayList<int[]> j = new ArrayList<int[]>(); int[] w = {1,2}; j.add(w); …但即使已将w添加到列表中,并且w包含与t完全相同的数组,此操作仍将返回false 是否有一种方法可以使用contains,这样我就可以检查ArrayList的元素之一是否具有数组值{1,2}?您需要遍历列表并手动检查数组是否符合您的条件 public static boole
ArrayList
,我向其中添加了一个数组
ArrayList<int[]> j = new ArrayList<int[]>();
int[] w = {1,2};
j.add(w);
…但即使已将w
添加到列表中,并且w
包含与t
完全相同的数组,此操作仍将返回false
是否有一种方法可以使用contains,这样我就可以检查
ArrayList
的元素之一是否具有数组值{1,2}
?您需要遍历列表并手动检查数组是否符合您的条件
public static boolean containsSubArray(List<int[]> j, int[] sub) {
for ( int[] arr : j ) {
if (arr contains elements of sub) {
return true;
}
}
return false;
}
publicstaticboolearncontainssubray(列表j,int[]sub){
对于(int[]arr:j){
if(arr包含子元素){
返回true;
}
}
返回false;
}
如果需要精确匹配,可以使用
数组.equals()
。不过,我不认为有一个库函数可以对数组执行包含所有内容的操作,因此如果需要的话,您必须自己编写该函数。数组只能与数组进行比较。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.
ArrayList j=new ArrayList();
ArrayList w=新的ArrayList();
w、 增加(1);w、 增加(2);
j、 加(w);
ArrayList t=新的ArrayList();
t、 增加(1);t、 增加(2);
返回j.contains(t);//应该返回true。
来自java api:
public boolean contains(Object o)
如果此列表包含
指定的元素。更正式地说,
当且仅当此列表
包含至少一个元素e,例如
这(o==null?e==null:o.equals(e))
由于int[]
是一个原语,我很确定不存在.equals方法,所以我猜它总是返回false
我会推荐一种不同的数据存储方式?也许用某种钥匙 这里的问题是数组不重写,因此使用默认的equals()实现对两个列表项进行比较
// from Object.class
public boolean equals(Object obj) {
return (this == obj);
}
因此,您必须迭代列表并使用检查所有条目。下面是一个帮助器方法,它可以执行以下操作:
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;
}
publicstaticbooleanisinlist(
最终列表,最终整数[]候选人){
对于(最终int[]项:列表){
if(数组.equals(项目,候选)){
返回true;
}
}
返回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
}
publicstaticbooleanisinlist(
最终列表,最终整数[]候选人){
return list.stream().anyMatch(a->Arrays.equals(a,candidate));
//^--或者您可能希望在此处使用.parallelStream()
}
“包含”合同检查是否相等。所以在你的例子中失败的是int[]的相等性。由于Array
不会覆盖Object
中的equals方法,因此需要一种变通方法来检查是否包含
如果您需要检查
数组中的包含情况,那么您别无选择,只能遍历ArrayList并自己进行比较。如果两个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()将返回false。
对于您的情况,您需要自己实现一种方法来比较它们。不幸的是,这并不能解决真正的问题。如果w
有1,2,3
,会怎么样?我以为用户想要比较精确的数组,他没有提到数组的一部分。int[]
实际上不是一个原语。所有数组都是对象
并继承其equals()
的实现,如果操作数是同一实例(==
)int[]不是基元,则返回true。int是。int[]扩展对象,但不重写equals()。我试图了解这样一个事实,即它不重写equals()方法,因此不能用于contains。
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 (!)