【问题标题】:List without duplicates?列表没有重复?
【发布时间】:2011-11-01 00:40:10
【问题描述】:

我刚刚阅读了Is there a no-duplicate List implementation out there? 关于List 的回答,而不是Set,该实现不允许重复。接受的答案推荐 Collections15 SetUniqueList。有没有等价物——也许在番石榴中? (我搜索了文档但找不到)--在其他库中还是有其他一些当前流行的解决方案?

【问题讨论】:

  • 这么复杂的事情,不花半个小时就搞定了?真的,采用您选择的List<t> 实现并将Set<T> 固定在它上面。请咨询add()addAll() 上的设置;其他任何东西都不能创建重复项(除非您存储变异对象)。
  • 谢谢@9000!自己动手没问题,只是想了解一下情况,看看有没有我不知道的所有酷孩子都在使用的东西。
  • @JarrodRoberson,不。 SortedSet 的超接口是 Set 而不是 List
  • @JarrodRoberson,从技术上讲,它不是一个列表。如果有的话,它实际上是一个列表,所以你会混淆你的条款。
  • @JarrodRoberson 除了集合之外,列表和集合或 sortedSet 之间几乎没有共同点。列表根据插入顺序排序,集合根本不排序,sortedSets 根据您存储的对象的自然顺序或指定 Comparator 进行排序

标签: java list collections


【解决方案1】:

当我有一个不应该有任何重复的集合时,我喜欢要求正确的 Java 语义,即使用 Set 接口。也就是说,在许多情况下,为了方便起见,您希望像List 那样保留插入顺序,维护两个并行数据结构似乎很浪费并且保持同步很复杂。这就是为什么我使用这样的东西。 InsertionOrderSet.java 这是SortedSet 的一个特殊实现,它使用包装对象来维护,index 可以通过比较器进行排序,但对外部消费者隐藏了实现细节,所以它看起来就像一个普通的旧类型安全SortedSet

【讨论】:

    【解决方案2】:

    您链接的答案中的内容似乎已经足够了。我会选择其中一种解决方案。或者,您可以简单地扩展类 ArrayList 并覆盖一些在为同一方法调用 super.method 之前对 HashSet 进行检查的方法。只需将 Set 添加为实例字段,将其用于检查重复项并添加/删除添加到列表中/从列表中删除的任何项目。

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 2018-04-25
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 2022-06-17
      • 2012-01-10
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多