【问题标题】:Set implementation that keeps insertion order and provides index access设置保持插入顺序并提供索引访问的实现
【发布时间】:2013-10-04 14:27:07
【问题描述】:

我目前正在搜索 Set 的 Java 实现,它保持原始插入顺序并提供按索引访问。此外,我想要一个批量 appendAll() 方法,该方法采用另一个集合并将其附加到末尾(重复项除外,因为这是一个集合)。

LinkedHashSet 有点朝着正确的方向发展,但它缺少索引访问和批量追加。

我可以自己写这个,但为什么要重新发明呢?

【问题讨论】:

  • addAll() 有什么问题?
  • 鉴于Set 在其接口中没有get(index) 方法,我看不出这是如何实现的。当接口不暴露这个操作时,你打算如何通过索引来检索元素?
  • @DeepakBala 他可以创建一个类MySet,它确实有这个操作并使用它。您可以添加超出Set 中定义的方法。
  • 看来您实际上需要一个不接受重复项的 ArrayList。继承 ArrayList 会不会更容易?
  • @arshajii 虽然这是真的,但您永远不能将此 Set 返回给调用者并期望他们使用此索引功能。调用者总是需要知道底层的 impl。我同意可以添加该功能,但如果 impl 必须是 Set,它将以牺牲多态性为代价。

标签: java data-structures


【解决方案1】:

Apache Commons 中的ListOrderedSet 怎么样?

装饰另一个 Set 以确保 添加的顺序被保留并被迭代器使用。

如果第二次将对象添加到集合中,它将在迭代中保持在原始位置。可以通过迭代器或 toArray 方法从集合中观察到顺序。

ListOrderedSet 也有各种有用的直接方法。其中包括许多来自 List 的内容,例如 get(int)、remove(int) 和 indexOf(int)。可以通过 asList() 获得集合的不可修改的 List 视图。

它实现了 java.util.Set,但由于 .get(index) 不是 Set 定义的方法,您需要确保将其作为 ListOrderedSet 传递,而不是 Set。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2011-09-21
    • 2014-03-03
    • 2023-01-23
    • 1970-01-01
    • 2011-01-23
    • 2012-03-15
    • 2021-08-19
    • 2010-12-09
    相关资源
    最近更新 更多