【问题标题】:How can I find if my ArrayList of int[] contains an int[]如何查找我的 int[] ArrayList 是否包含 int[]
【发布时间】:2014-03-25 01:12:29
【问题描述】:

我有一个包含int[]ArrayList

假设Arrays.equals(int[], (a value in the arrayList)) = true

为什么当我做arrayOfInts.contains(int[]) 时这是假的?

我认为这与(int[] == (a value in the arrayList)) = false 的原因相同,但我应该收到此错误吗?

我能以某种方式纠正它吗?

TL;DR:我可以将 Arraylist.contains() 用于 int[]


编辑:

ANSWER(如果将来有人搜索这个,这是我作为解决方案制作的比较代码):

private boolean arraylistContains(int[] comparison, ArrayList<int[]> arrayListToCompare){
    for(int[] values: arrayListToCompare){
        if (Arrays.equals(comparison, values)){
            return true;
        }
    }
    return false;
}

【问题讨论】:

  • 您能否展示一些有效的代码示例,最好是您实际测试代码的那些示例? int[]1 应该做什么?
  • 是 Java 吗?只是想知道为什么奇怪的语法......
  • 修正了语法。 "int[]1" 表示它不仅仅是 int[] 而是 int 中的一个值。为混乱道歉。

标签: java arrays arraylist int contains


【解决方案1】:

很遗憾,你不能。我可能会将数组包装在另一个对象中,然后将其放入列表中。类似的东西(完全未经测试):

public class IntArrayWrapper {
    private final int[] intArray;
    public IntArrayWrapper(int[] intArray) {
        this.intArray = intArray;
    }
    @Override
    public int hashCode() {
        return Arrays.hashCode(intArray);
    }
    @Override
    public boolean equals(Object other) {
        return other instanceof IntArrayWrapper && Arrays.equals(this.intArray, ((IntArrayWrapper) other).intArray);
    }
}

然后,如果您决定将来用 HashSet 替换 ArrayList,例如,这将很简单(并且您可能会获得一些不错的性能提升)。

【讨论】:

    【解决方案2】:

    你不能因为

        int[] a = { 1,2,3 };
        int[] b = { 1,2,3 };
        List<int[]> list = new ArrayList<int[]>();
        list.add(a);
        list.contains(b); // is false
    

    a 不等于b,这意味着a.equals(b) 将返回false。方法Collection.contans(Object) 使用equals 来检查一个对象是否已经在集合中。因此,如果a.equals(b)false,即使它们看起来相同,您也会得到该数组不在集合中。

    有一个例外。如果它们真的是同一个对象contains 将返回true。见下文:

        int[] a = { 1,2,3 };
        List<int[]> list = new ArrayList<int[]>();
        list.add(a);
        list.contains(a); // is true
    

    【讨论】:

    • 你能澄清一下吗?任何看到您帖子的新用户都不会知道您想说什么,因为他们看起来一样。
    • java.util.AbstractCollection方法contains
    【解决方案3】:

    数组列表只存储对数组的引用,而不是它们的内容,因此contains() 只能说,如果列表包含对您输入的数组的确切引用。它不评估数组的内容。

    如果您需要检查列表是否包含具有特定值的数组,则必须遍历列表并使用Arrays.equals(arr1, arr2)

    【讨论】:

    • 刚刚为它做了一个函数。谢谢。认为可能有一个内置的方法。
    【解决方案4】:

    REFER -> https://stackoverflow.com/a/106351/1897935

    ArrayList<Object> list = ...;
    for (Object o : list) {
            if (o.getClass().equals(Integer.TYPE)) {
                handleInt((int)o);
            }
            else if (o.getClass().equals(String.class)) {
                handleString((String)o);
            }
            ...
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-14
      • 2020-03-06
      • 2011-06-26
      • 2015-10-25
      • 2016-05-27
      • 2014-04-09
      • 2013-10-17
      • 1970-01-01
      相关资源
      最近更新 更多