Java 具有独特元素的有序集合和最旧元素的替换

Java 具有独特元素的有序集合和最旧元素的替换,java,android,arrays,collections,set,Java,Android,Arrays,Collections,Set,Java/Android中是否有一个有序的集合,允许添加唯一的元素,但用新的相同项目替换最旧的元素?例如,如果我的收藏是: ["foo", "bar", "alice", "bob"] 我再次添加条,期望的结果是: ["foo", "alice", "bob", "bar"] 此外,如果该集合允许弹出O(1)中的最后一个元素,那就太好了 编辑 到目前为止,我认为最好的解决方案是使用ArrayList,如下所示: ArrayList<String> myArray = new Ar

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

["foo", "bar", "alice", "bob"]
我再次添加
,期望的结果是:

["foo", "alice", "bob", "bar"]
此外,如果该集合允许弹出
O(1)
中的最后一个元素,那就太好了

编辑

到目前为止,我认为最好的解决方案是使用
ArrayList
,如下所示:

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

[...]

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

myArray.add(myString);
ArrayList myArray=new ArrayList();
[...]
如果(!myArray.contains(myString)){
myArray.remove(myString);
}
添加(myString);

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

基于红黑树的NavigableMap实现。地图已排序 根据其键的自然顺序,或通过比较器 在地图创建时提供,具体取决于使用的构造函数。 此实现为服务器提供了有保证的日志(n)时间成本 containsKey、get、put和remove操作。算法是 Cormen、Leiserson和Rivest《简介》中的改编版 算法

请注意,由树映射维护的排序与任何排序映射一样, 无论是否提供了明确的比较器,都必须 如果要正确实现此排序映射,则与等于一致 地图界面。(参见可比或比较器以获得精确的 这是因为地图 接口是根据equals操作定义的,但是 map使用其compareTo(或compare)执行所有键比较 方法,因此此方法认为相等的两个键 排序贴图的视点,相等。排序贴图的行为是 定义良好,即使其顺序与equals不一致;只是 未能遵守地图接口的总合同

表示一个根据某种标准排序的集合(您可以定义自己的比较器),因此请看一下实现:和

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

LinkedHashSet
与您想要的非常接近

Set
实现不能包含重复的值,并且此实现和按插入顺序排序。这里唯一的“抓到”来自文档:

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


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

也许只需删除元素,然后再添加它,就可以使用ArrayList或Vector实现相同的效果。您看到了吗?不排序,只排序正确。@Alatau:是的,我知道,但是使用ArrayList,在最坏的情况下,它意味着一个
O(n)
计算,所以我想避免这种情况@用户158037:看来这并不能解决我的问题@是的,对。。。仅订购。为什么使用LinkedHashMap而不是LinkedHashSet?主要优点是什么?我的错误。。。应该已经被设置好了。答案编辑一致但我一直在想,如果我需要删除现有值,然后重新添加新值,集合是无用的,因为复制是手动管理的,对吗?请参阅我问题的编辑部分。是的,也许可以使用LinkedHashSet来解决问题,但我需要删除现有元素,然后再添加它们。