【问题标题】:List backed up by a HashSet由 HashSet 备份的列表
【发布时间】:2016-03-31 18:19:19
【问题描述】:

我需要按照添加的顺序将对象存储在集合中,这就是我需要List 的原因。但是,该列表不应包含重复项。我还需要快速确定集合中是否已存在对象。与其每次都迭代列表,不如使用HashSet 之类的东西。我可以快速查找和添加元素并保留插入顺序。

问题是 - 我应该:

  1. 通过添加 HashSet 字段来扩展 ArrayList?

  2. 实现 Java 集合接口(List 或 Set)之一?

  3. 只需创建一个包含两个字段的新类 - ArrayList 和 哈希集?

第一个选项有一个缺点——我不需要所有的 ArrayList 方法,所以我必须重写所有这些方法,这样我的类的用户就不会调用只会搞砸的基类方法(例如,可以从列表中删除一个对象,但该对象仍然存在于集合中)。并且没有办法删除基类方法(除非覆盖它并抛出异常)。

对于 2,我确实必须实现接口的所有方法。

第 3 个选项对我来说是最好的,但它使代码实现依赖,因为我的类没有实现任何接口。

在这种情况下我该怎么办? 我希望拥有List 接口具有的所有add 方法。 - LinkedHashSet 不是一个选项

【问题讨论】:

  • 为什么不为您的列表调用contains(Object o),如果该对象已经在您的列表中,请不要再添加它
  • 因为列表的 O(n) 和集合的 O(1)。而且我的收藏很大。
  • 考虑到您的限制,是的,绝对是选项 3。尽管您的需求列表仍然没有任何明显的理由,但您需要所有各种 add 方法。
  • @LouisWasserman 好的,但我知道我需要它们。谢谢。

标签: java list collections set


【解决方案1】:

您可以使用 LinkedHashSet,它是一个 Set 实现,可确保迭代顺序与您添加元素的顺序相同。

Set 接口的哈希表和链表实现,具有可预测的迭代顺序。 ...这个链表定义了迭代顺序,也就是元素插入集合的顺序(insertion-order)

【讨论】:

    【解决方案2】:

    无需自己实现任何东西。使用LinkedHashSet 维护相遇顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多