我正在寻找PriorityQueue实施,这也是Set。
compareTo
实现,如果其元素不得要求与equals
的实现保持一致。
是否存在这样的java实现?
更新:我现在使用SortedSet作为内部集合来实现它。所以我只需要实现缺少的方法来满足队列接口。我也忘了提到它也必须是一个有界的队列,因此它具有容量并在达到容量时丢弃该组的最后一个元素。
答案 0 :(得分:6)
如果一个队列具有'类似于'的行为就足够了,那么你只是不想接受重复的条目,那么我认为,一个简单的解决方案可能是子类PriorityQueue
并覆盖add()
,addAll()
和offer()
等方法:
@Override
public boolean offer(E e) {
if (contains(e)) {
return false;
} else {
return super.offer(e);
}
}
顺便说一句 - add()
在内部调用offer()
,所以可能只是覆盖offer()
方法并在那里进行检查。
答案 1 :(得分:3)
TreeSet
是一个提供有序迭代器的集合。它实现了SortedSet
接口,它保证iterator
方法返回的迭代器将按照自然顺序(通过Comparable
)确定的升序返回集合的元素,或者由创建时所给出的比较器确定。
答案 2 :(得分:1)
PriorityQueue
本身依赖于Comparitor
或其排序项的自然顺序,同样Set
依赖于自然顺序或Comparitor
函数所以不,我不认为一个存在作为默认Java安装的一部分......
但如果只是通过简单地实现你想要的接口,并使用他们的自然背景等等,你可以很容易地创建一个... ...
MyQueueSet extends PriorityQueue implements Set {
HashSet set;
...
}
不幸的是,Java的java.util。*数据集类并不总是最容易扩展而不重写其代码块。
PriorityQueue
支持是堆排序的元素列表,因此插入新元素然后执行contains(e)
测试将进行O(n)搜索,因为排序基于排队,不数据值,如果你包含HashSet
来支持Set
功能,你可以大大改善你的查询时间,但代价是维护数据集引用两次(记住Java是按值传递的,所有对象都存在于堆上。这应该可以提高大型集的性能。
答案 3 :(得分:0)
PriorityQueue是一个AbstractCollection - 它具有与Set几乎相同的接口。我确信制作一个将PriorityQueue转换为Set的包装器会很容易。如果你真的需要强制执行,你可以保留插入元素的副哈希表以避免重复。
我不认为PriorityQueue要求compareTo与equals一致。 PriorityQueue根本不使用equals(除了它继承的AbstractCollection操作?)。