【问题标题】:Does a set has the same elements as a list in Java?集合是否与 Java 中的列表具有相同的元素?
【发布时间】:2014-03-01 04:09:49
【问题描述】:

我在 java 中有一个 ArrayList<SomeObject>,其中多次包含一些 <SomeObject>。 我还有一个Set<SomeObject>,它只包含一些元素。这些元素只能通过其名称 (String SomeObject.Name) 进行唯一区分。

如何查看列表中的元素是否与集合完全相同,但可能有多次?

谢谢

【问题讨论】:

  • sets .retainAll() 方法将只保留公共元素。您是否想要它们包含相同元素的真/假?您可以在每个数组成员的集合上使用 .contains 暴力破解
  • @RichardTingle 我不想编辑我的初始设置。此外,这些对象可能实际上并不相同。它们只有相同的名称,这使得它们在我的系统中是相等的。此外,Set 包含 List 的所有内容,但可能还包含更多内容。因此,我的问题是列表中唯一项目的 # 是否与集合大小的 # 相等

标签: java list set


【解决方案1】:

有几个集合库可以做到这一点。例如commons-collection:https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html#isEqualCollection-java.util.Collection-java.util.Collection-

例如。 CollectionUtils.isEqualCollection(myList, mySet)

如果你必须自己编写,没有库,那么只需检查每个包含另一个的所有元素:

`mySet.containsAll(myList) && myList.containsAll(mySet)`

【讨论】:

    【解决方案2】:

    似乎最简单的单行解决方案可能是

    return new HashSet<SomeObject>(list).equals(set);
    

    ...它只识别list 的唯一元素并验证它与set 完全匹配。

    【讨论】:

      【解决方案3】:

      您可以使用 HashSet 将 ArrayList 转换为集合:

      HashSet listSet = new HashSet(arrayList);
      

      要检查ArrayList最初是否有更多元素,只需比较listSetarrayListsize()结果:

      boolean sameSize = listSet.size() == arrayList.size()
      

      那么就可以得到两个集合的交集(它们共有的元素):

      listSet.retainAll(set1)
      

      如果现在是listSet.size() == set1.size(),那么它们具有相同的元素,因为两个列表中的所有元素都是共享的。要检查arrayList最初是否有重复元素,请检查之前的布尔值:如果sameSizetrue,那么他们有,false意味着他们没有。

      【讨论】:

      • 感觉会有一个不错的内置函数;这就是为什么我没有使用我的评论回答
      • 我真的很喜欢这个解决方案。 :) 但是我的问题可以吗?因为我可能有两个不同的项目,但具有相同的值(名称)......
      • @Jim 这将使用 .equals 方法。只要您覆盖它以表示您的“等于”版本,那么您就可以了(记住也要覆盖哈希码)
      • @JimBlum,Richard Tingle 说的。
      • @MartinDinov 非常感谢。但是我在这一行得到 Sets cannot be resolved 错误 Sets.difference(set1, listSet);如果我将 Sets 更改为 Set 我得到错误 The method difference(Set, HashSet) is undefined for the type Set...我做错了吗?
      【解决方案4】:

      你有几个选择:

      • 将所有 List 元素添加到 Set 并检查大小是否相同;
      • 根据您的 Set 创建一个新列表并检查它们是否相等。

      【讨论】:

        【解决方案5】:

        所有Java集合都有boolean containsAll(collection&lt;&gt;)方法,所以如果我们想检查两个集合是否包含相同的元素,我们可以写collection1.containsAll(collection2) &amp;&amp; collection2.containsAll(collection1),如果collection1collection2包含相同的元素,它将返回true

        【讨论】:

          【解决方案6】:

          创建一个哈希,它是一个字符串和一个整数的计数次数。 Interate 认为列表创建一个 Hash 条目并设置为 1,如果元素已经存在,则将其添加到计数中。

          Hash<String, Integer> hash = new HashMap<String, Integer>();
          for (String s : list) {
              if (hash.containsKey(s))
                  hash.put(s, hash.get(s)++);
              else
                  hash.put(s,1);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-20
            • 2016-01-30
            • 2019-05-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多