【问题标题】:Collection that prevents duplicates but preserves reversible duplicate insertion order?防止重复但保留可逆重复插入顺序的集合?
【发布时间】:2014-04-02 17:06:33
【问题描述】:

是否存在保留可逆重复插入顺序的集合?

具体来说,如果我插入以下项目:

1
2
3
1

我希望能够遍历它们并按以下顺序接收它们:

1
3
2

也就是说,我希望它们按降序插入顺序,重复插入会导致重新排序。 Guava's LinkedListMultimap 是我找到的最接近的,但它不支持降序遍历。

Java's LinkedHashSet 不起作用,因为它不允许降序遍历。

我也可以使用 LRU 缓存,但我发现的大多数 LRU 库都不支持按 LRU 顺序检索对象。

这东西有标准名称吗?

【问题讨论】:

标签: java data-structures collections guava


【解决方案1】:

使用LinkedHashSet 怎么样?当您检测到该项目在其中时,您将其移除并重新插入?只有这样才能保证插入顺序符合您的预期(或相反)。

您可以通过在LinkedHashSet 上创建LinkedList 并以您喜欢的任何方式反转它来iterate over the LinkedHashSet,例如通过使用 Guava 的 Lists.reverse 方法。

【讨论】:

  • 有没有办法对LinkedHashSet进行反向迭代?或者您是否需要创建它的反向 LinkedList 表示?
  • 我认为您必须将集合转换为列表,然后您可以使用 Guava 的 Lists.reverse 方法创建反向视图。
  • 查看了其他一些选项(descendingIterator()Collections.reverse(List)ListIterator.previous() 我猜 Guava 的方法可能同时是最容易使用和最有效的方法。
  • 创建它的LinkedList 表示将需要整个Set 的迭代。我想要一个能保持最新状态的集合。
  • 那么LinkedHashSet 不是适合这项工作的工具。集合可以有多大?
【解决方案2】:

尝试ListOrderedSet 类的org.apache.commons.collections4.set

例如:

listOrderedSet.add(1,1);
listOrderedSet.add(1,2);
listOrderedSet.add(1,3);
listOrderedSet.add(1,1);  

这将为您提供预期的输出。

【讨论】:

  • 不知何故,Apache API 总是让我有点痒,使用特殊的插入方法并不像应有的那样干净,它不是Set 接口的一部分。
  • 是的,Apache 集合已经过时了。我也不认为这会奏效。根据 add 方法的 javadoc:“如果指定元素尚未包含在此有序集中(可选操作),则在指定位置插入指定元素。”意思是如果它已经在那里,位置就不会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 2010-12-26
  • 2015-08-07
  • 2011-01-23
  • 2018-02-10
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多