在包含整数数组的ArrayList上使用contains

我有一个ArrayList ,我向它添加一个数组。

 ArrayList j = new ArrayList(); int[] w = {1,2}; j.add(w); 

假设我想知道j包含一个不使用w {1,2}的数组,因为我将从另一个类调用它。 所以,我在其中创建了一个带有{1,2}的新数组……

 int[] t = {1,2}; return j.contains(t); 

…但是即使将w添加到列表中,这也会返回false,并且w包含与t完全相同的数组。

有没有办法使用包含这样我可以检查以查看ArrayList其中一个元素是否具有数组值{1,2}

数组只能与Arrays.equals()进行比较。

您可能需要ArrayList的ArrayList。

 ArrayList> j = new ArrayList>(); ArrayList w = new ArrayList(); w.add(1); w.add(2); j.add(w); ArrayList t = new ArrayList(); t.add(1); t.add(2); return j.contains(t); // should return true. 

这里的问题是数组不会覆盖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 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 list, final int[] candidate) { return list.stream().anyMatch(a -> Arrays.equals(a, candidate)); // ^-- or you may want to use .parallelStream() here instead } 

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

 public static boolean containsSubArray(List j, int[] sub) { for ( int[] arr : j ) { if (arr contains elements of sub) { return true; } } return false; } 

如果想要完全匹配,可以使用Arrays.equals() 。 我不认为有一个库函数可以在数组中包含所有内容,所以你必须自己编写,如果这是你想要的。

“包含”合同检查是否平等。 所以在你的情况下失败的是int []的相等。 由于Array不会覆盖Object的equals方法,因此您需要一种解决方法来检查包含。

如果你需要检查Array包含,那么你别无选择,只能遍历ArrayList并自己进行比较。

来自java api:

 public boolean contains(Object o) 

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

因为int[]是一个原语,我很确定没有.equals方法存在,所以我的猜测它总是返回false。

我建议采用不同的方式存储数据? 也许带着某种钥匙?

如果它们具有相同的对象引用,则两个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方法。

首先它们不是相同的Object引用,所以它们不相等。 equals()将返回false。 根据您的情况,您需要实现一种方法来自己比较它们。