在带有整数数组的 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 数组? [复制]

带有两个数组的Java foreach循环[重复]

在 Java 中不使用 Arraylist 的情况下为类制作动态数组,并且没有正确教授如何去做

排序包含字符串和整数的数组列表

带有 TypeError 的 TensorRT 对象检测:只能将整数标量数组转换为标量索引