是否有一个Queue(PriorityQueue)实现也是一个Set?

时间:2009-12-08 18:46:37

标签: java queue set priority-queue

我正在寻找PriorityQueue实施,这也是Set

compareTo实现,如果其元素不得要求与equals的实现保持一致。

是否存在这样的java实现?

更新:我现在使用SortedSet作为内部集合来实现它。所以我只需要实现缺少的方法来满足队列接口。我也忘了提到它也必须是一个有界的队列,因此它具有容量并在达到容量时丢弃该组的最后一个元素。

4 个答案:

答案 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操作?)。