在带有整数数组的 ArrayList 上使用 contains
Posted
技术标签:
【中文标题】在带有整数数组的 ArrayList 上使用 contains【英文标题】:Using contains on an ArrayList with integer arrays 【发布时间】:2011-06-18 10:56:08 【问题描述】:我有一个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。
有没有一种方法可以使用包含这样我就可以检查ArrayList
的元素之一是否具有数组值1,2
?
【问题讨论】:
【参考方案1】:数组只能与 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.
【讨论】:
不幸的是,这并不能解决真正的问题。如果w
拥有1,2,3
会怎样?
我以为用户想要比较精确的数组,他没有提到数组的切片。【参考方案2】:
这里的问题是数组不会覆盖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
【讨论】:
【参考方案3】:您需要遍历列表并手动检查数组是否符合您的条件。
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()
。我不认为有一个库函数可以在数组上包含所有内容,所以如果这是你想要的,你必须自己写。
【讨论】:
【参考方案4】:“包含”合同检查是否相等。因此,在您的情况下,失败的是int []的相等性。由于Array
不会覆盖Object
中的equals 方法,因此您需要一种解决方法来检查是否包含。
如果您需要检查 Array
中的包含情况,那么您别无选择,只能遍历 ArrayList 并自己进行比较。
【讨论】:
【参考方案5】:来自java api:
public boolean contains(Object o)
如果此列表包含 指定的元素。更正式地说, 当且仅当此列表返回 true 包含至少一种元素 e 这样 那个
(o==null ? e==null : o.equals(e))
。
因为int[]
是一个原始的,我很确定不存在 .equals 方法,所以我猜它总是返回 false。
我会推荐一种不同的数据存储方式吗?也许用某种钥匙?
【讨论】:
int[]
实际上并不是一个原语。所有数组都是 Object
并继承其实现 equals()
如果操作数相同则返回 true instance (==
)
int[] 不是原始的。国际群岛int[] 扩展 Object,但不覆盖 equals()
啊,我的 b。我试图了解它不会覆盖 equals() 方法,因此不能用于包含的事实。【参考方案6】:
如果两个 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 (!)
如果 order 不应该影响相等,那么您将不得不自己实现一个静态 equals 方法。
【讨论】:
【参考方案7】:首先它们不是同一个对象引用,所以它们不相等。 equals() 将返回 false。 根据您的情况,您需要自己实现一种方法来比较它们。
【讨论】:
以上是关于在带有整数数组的 ArrayList 上使用 contains的主要内容,如果未能解决你的问题,请参考以下文章
更改数组列表时,带有 ArrayList 和 ListView 的 Android 数组适配器不会更新
将整数对象的 ArrayList 转换为 int 数组? [复制]