Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一个队列(PriorityQueue)实现也是一个集合?_Java_Queue_Set_Priority Queue - Fatal编程技术网

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)哈希查找,因此您在该规则中是正确的。我将更新答案…不,优先级队列没有一致性约束,但排序集有。我真的不想有两个集合包含相同的元素,这是我想到的一种可能性。我只是想也许有人已经实现了这样一个集合。