Java 是否有一个队列(PriorityQueue)实现也是一个集合?
我正在寻找一个实现,这也是一个很好的例子 如果Java 是否有一个队列(PriorityQueue)实现也是一个集合?,java,queue,set,priority-queue,Java,Queue,Set,Priority Queue,我正在寻找一个实现,这也是一个很好的例子 如果的元素不能要求与的实现一致,则的compare to实现等于 有这样的java实现吗 更新:我现在使用SortedSet作为内部集合来实现它。因此,我只需要实现缺少的方法来满足队列接口。我还忘了提到它也必须是一个有界队列,因此它具有一个容量,如果达到容量,它将丢弃集合中的最后一个元素。那么优先级队列本身将取决于比较器或排序项目的自然顺序,同样地,Set将取决于自然顺序或Comparitor函数,因此不,我认为默认Java安装中不存在一个函数 但是如果
的元素不能要求与的实现一致,则的compare to
实现等于
有这样的java实现吗
更新:我现在使用SortedSet作为内部集合来实现它。因此,我只需要实现缺少的方法来满足队列接口。我还忘了提到它也必须是一个有界队列,因此它具有一个容量,如果达到容量,它将丢弃集合中的最后一个元素。那么优先级队列本身将取决于比较器
或排序项目的自然顺序,同样地,Set
将取决于自然顺序或Comparitor
函数,因此不,我认为默认Java安装中不存在一个函数
但是如果不担心速度的话,通过简单地实现你想要的接口,并使用它们的自然背景,你可能很容易创建一个。。。阿卡
MyQueueSet extends PriorityQueue implements Set {
HashSet set;
...
}
不幸的是,Java的Java.util.*数据集类在不重写代码块的情况下并不总是最容易扩展的
PriorityQueue
backing是一个元素的堆排序列表,因此插入新元素,然后执行contains(e)
测试将进行O(n)搜索,因为排序基于队列,而不是数据值,如果您包括一个HashSet
以支持Set
功能,您可以以两次维护数据集引用为代价来大大提高查找时间(请记住,Java是按值传递的,所有对象都位于堆上)。这应该可以提高大型集合的性能。如果队列具有“类似集合”的行为就足够了,因为您只是不想接受重复的条目,那么我认为,一个简单的解决方案是将优先级队列
子类化,并覆盖添加()
、添加所有()
和提供()
方法,如:
@Override
public boolean offer(E e) {
if (contains(e)) {
return false;
} else {
return super.offer(e);
}
}
顺便说一句,add()
在内部调用offer()
,因此可能只需覆盖offer()
方法并在那里进行检查就足够了。PriorityQueue是一个抽象集合-它与集合具有几乎相同的接口。我相信制作一个将PriorityQueue转换为Set的包装器是很容易的。如果您真的需要强制执行,您可以保留插入元素的附加哈希表以避免重复
我不认为PriorityQueue要求compareTo与equals保持一致。PriorityQueue根本不使用equals(除了继承的AbstractCollection操作?)。是一个提供有序迭代器的集合。它实现了接口,该接口保证由迭代器
方法返回的迭代器将按自然顺序(通过可比
)以升序返回集合的元素,或由创建集合时提供给集合的比较器确定。但队列和集合之间不共享对象。。。他们完全无关。。。这是一种(错误的)多重继承?@dfa对象在队列和集合之间共享。。。只是它们的引用被存储在两个集合中。。。我的建议与@Andreas_D完全相同——这是Java集合工作中非常常见的解决方案。如果Java的集合更容易扩展和创建自己的集合,那么它就不会那么粗糙了……这对我来说没有多大意义。优先级队列已经排序,因此您只需要一个普通的集合。此外,我认为在我的情况下,拥有两个集合的开销会很高,我的对象相对较小,但我有很多对象。@Mauli PriorityQueue是一个堆排序列表,我非常确定集合备份是哈希或红黑树备份,这取决于您选择的实现,因此您可以选择O(n)时间包含搜索或O(logn)或O(1)哈希查找,因此您在该规则中是正确的。我将更新答案…不,优先级队列没有一致性约束,但排序集有。我真的不想有两个集合包含相同的元素,这是我想到的一种可能性。我只是想也许有人已经实现了这样一个集合。