在一个整数数组的ArrayList中使用contains函数

16

我有一个 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完全相同的数组,此操作将返回false。

是否有一种使用contains的方法,可以仅检查ArrayList的一个元素是否具有数组值{1,2}

8个回答

11

只能使用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.

不幸的是,那不会解决真正的问题。如果 w1,2,3 呢? - Mark Peters
我认为用户想要比较完全相同的数组,他没有提到数组的切片。 - Clement P

11

问题在于数组不会覆盖 Object.equals(Object) 方法,因此两个列表条目之间的比较将使用默认的 equals() 实现。

// from Object.class
public boolean equals(Object obj) {
return (this == obj);
}

你需要对列表进行迭代,并使用 Arrays.equals(int[], int[]) 检查所有条目。这里有一个可以完成此操作的辅助方法:

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
}

0

你需要遍历列表并手动检查数组是否符合你的条件。

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

来自Java API:

public boolean contains(Object o)

如果此列表包含指定的元素,则返回true。更正式地说,当且仅当此列表包含至少一个元素e,使得(o==null ? e==null : o.equals(e))时,返回true。

由于int[]是一个原始类型,我很确定没有.equals方法存在,所以我的猜测它总是会返回false。

我建议用不同的方式存储数据?也许带有某种键?


int[] 实际上不是一个原始类型。所有的数组都是 Object,并继承了它的 equals() 实现,如果操作数是相同的 实例 (==),则返回 true。 - Mark Peters
int[] 不是原始类型,而 int 是。int[] 扩展自 Object,但不重写 equals() 方法。 - Sean Patrick Floyd
啊我的B。我试图表达的是它不会覆盖equals()方法,因此不能用于包含。 - eosgood

0

如果两个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
如果您有一个数组并希望比较数组中的所有元素是否都存在于列表中:
Long[] array1 = {1111L, 1112L};
Long[] array2 = {1111L, 1114L};
List<Long> list = new ArrayList<>();
list.add(1111L);
list.add(1112L);
list.add(1113L);

Arrays.asList(array1).stream().allMatch(val -> list.contains(val)); //return true
Arrays.asList(array2).stream().allMatch(val -> list.contains(val)); //return false

0

"contains"合约检查相等性。所以在您的情况下,失败的是int[]的相等性。由于Array没有覆盖来自Object的equals方法,因此您需要一个解决方法来检查包含关系。

如果您需要在Array中检查包含关系,则只能通过迭代ArrayList并自行进行比较来完成。


0

首先,它们不是同一个对象引用,因此它们不相等。equals() 方法将返回 false。 对于您的条件,您需要实现一个方法来自行比较它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接