在具有整数数组的 ArrayList 上使用包含

新手上路,请多包涵

我有一个 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);

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

有没有一种方法可以使用 contains 这样我就可以检查 ArrayList 的元素之一是否具有数组值 {1,2}

原文由 kamikaze_pilot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 386
2 个回答

数组只能与 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.

原文由 Clement P 发布,翻译遵循 CC BY-SA 2.5 许可协议

这里的问题是数组不会覆盖 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
}

原文由 Sean Patrick Floyd 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题