Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在带有整数数组的ArrayList上使用contains_Java_Arrays_Arraylist_Contains - Fatal编程技术网

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 (!)