【问题标题】:Using contains on an ArrayList with integer arrays在带有整数数组的 ArrayList 上使用 contains
【发布时间】: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}

【问题讨论】:

    标签: java arrays arraylist contains


    【解决方案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。 根据您的情况,您需要自己实现一种方法来比较它们。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-10-08
              • 2020-09-30
              • 1970-01-01
              • 2011-12-15
              • 1970-01-01
              • 2016-02-24
              • 2016-10-02
              • 2019-03-23
              相关资源
              最近更新 更多