Java 具有独特元素的有序集合和最旧元素的替换
Java/Android中是否有一个有序的集合,允许添加唯一的元素,但用新的相同项目替换最旧的元素?例如,如果我的收藏是: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
["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来解决问题,但我需要删除现有元素,然后再添加它们。