【问题标题】:Ordered collection with unique elements and replacement of oldest ones具有独特元素和替换最旧元素的有序集合
【发布时间】:2015-11-19 00:27:08
【问题描述】:

Java/Android 中是否存在允许添加唯一元素但用新的相同元素替换最旧元素的有序集合?例如,如果我的收藏是这样的:

["foo", "bar", "alice", "bob"]

我再次添加bar,想要的结果是:

["foo", "alice", "bob", "bar"]

此外,如果该集合允许弹出O(1) 中的最后一个元素,那就太好了。

编辑

目前对我来说听起来最好的解决方案是使用ArrayList,如下所示:

ArrayList<String> myArray = new ArrayList<>();

[...]

if(!myArray.contains(myString)) {
    myArray.remove(myString);
}

myArray.add(myString);

【问题讨论】:

  • 也许在再次添加之前删除元素,然后使用 ArrayList 或 Vector 达到相同的效果。
  • 未排序仅排序正确..?
  • @Alatau: 是的,我知道,但是在最坏的情况下使用意味着 O(n) 计算的 ArrayList,所以我想避免这种情况。 @user158037:看起来这并不能解决我的问题。 @ShekharKhairnar:是的,对……只订购了。

标签: java android arrays collections set


【解决方案1】:

SortedSet 表示根据某些标准排序的集合(您可以定义自己的比较器),因此请查看实现:TreeSetConcurrentSkipListSet

除了 SortedSet 接口,还有LinkedHashSet 类。 它记住元素插入集合的顺序,并按该顺序返回其元素。 LinkedHashSet 有序,具有可预测的迭代顺序并允许重新插入现有值(但不影响插入顺序)。

【讨论】:

  • 是的,也许解决方案可以使用 LinkedHashSet,但我需要在再次添加之前删除现有元素。
【解决方案2】:

TreeMap 非常接近您的要求,但您必须找到一种结构来实现您的订单。您可以使用类似的接口对数据进行排序,但基于插入的排序还需要与 Queue 结合使用。

http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

基于红黑树的 NavigableMap 实现。地图已排序 根据其键的自然顺序,或通过比较器 在地图创建时提供,具体取决于使用的构造函数。 此实现为 containsKey、get、put 和 remove 操作。算法是 改编自 Cormen、Leiserson 和 Rivest 的引言 到算法。

请注意,树形图维护的顺序与任何排序图一样, 并且无论是否提供了明确的比较器,都必须是 如果要正确实现此排序映射,则与 equals 一致 地图界面。 (请参阅 Comparable 或 Comparator 以获得精确的 与等于一致的定义。)这是因为 Map 接口是根据equals操作定义的,但是一个排序的 map 使用它的 compareTo(或比较)执行所有键比较 方法,因此该方法认为相等的两个键是,来自 排序图的立场,相等。排序地图的行为是 定义明确,即使它的顺序与equals不一致;它只是 不遵守 Map 接口的一般约定。

【讨论】:

    【解决方案3】:

    LinkedHashSet 非常接近您想要的。

    Set 实现不能包含重复值,并且这个实现是按插入顺序排序的。唯一的“陷阱”来自文档:

    请注意,如果将元素重新插入集合中,插入顺序不会受到影响。

    这意味着您需要先删除它们的值,然后再重新插入,而不是重新插入。

    【讨论】:

    • 为什么使用 LinkedHashMap 而不是 LinkedHashSet?主要优势是什么?
    • 我的错误……应该是 LinkedHashSet。答案已相应编辑
    • 但是我一直在想,如果我需要删除现有值然后重新添加新值,那么集合是没用的,因为重复是手动管理的,对吧?请参阅我的问题的编辑部分。
    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多