在包含整数数组的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。 根据您的情况,您需要实现一种方法来自己比较它们。