2009-12-08 57 views
8

我在寻找一个PriorityQueue执行,也是一个Set是否有一个Queue(PriorityQueue)实现也是一个Set?

compareTo执行如果其元素必须没有要求与执行equals一致。

是否有某处这样的java实现?

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

回答

1

PriorityQueue将会本身依赖于Comparitor或物品的分拣的自然顺序,也因此没有我不认为一个存在Set将依赖于自然排序或Comparitor功能作为默认安装的Java的一部分......

但你可能可以创建一个很容易地,如果速度不担心通过简单地实现你想要的接口,并利用自己的天然背衬,等...又名

MyQueueSet extends PriorityQueue implements Set { 
    HashSet set; 
    ... 
} 

不幸的是Java的java.util 。*数据集类并不总是最容易扩展而不重写代码的块。

PriorityQueue背衬是元件的堆排序的列表,以便将新的元件,然后做一个contains(e)测试将一个O(n)的搜索,因为分选是基于排队,上的数据值不,如果尽管可以包含HashSet以支持Set功能,但可以通过两次维护数据集引用(请记住,Java是按值传递并且所有对象都位于堆上)来提高查找时间。这应该会提高一大组的性能。

+0

但是队列和集合之间没有共享对象......它们完全无关......这是一种(错误的)多重继承? – dfa 2009-12-08 20:51:48

+0

@dfa对象在队列和集合之间共享......只是它们的引用被存储在两个集合中......我的建议与@Andreas_D完全相同 - 它是Java的Collections工作中使用的非常常见的解决方案。如果Java的Collections更容易扩展并创建自己的,那么它不会那么黑客... – Petriborg 2009-12-09 19:36:26

+0

这对我来说没有什么意义。优先级队列已经排序,所以你只需要一个普通的设置。此外,我认为在我的情况下,有两个集合的开销会很高,我的对象相对较小,但我有很多。 – Mauli 2009-12-10 08:27:30

6

如果它是足够有一个'设置类似的行为,你只是不想接受重复条目IAW队列,那么我认为,一个简单的解决方案可能是子类PriorityQueue和覆盖add()addAll()offer()方法,如:

@Override 
public boolean offer(E e) { 
    if (contains(e)) { 
    return false; 
    } else { 
    return super.offer(e); 
    } 
} 

BTW - add()电话offer()内部,所以也许它甚至不够的,只是重写offer()方法和做检查那里。

+2

这是我想到的一种可能性。我只是认为有人可能已经实施了这样一个集合。 – Mauli 2009-12-10 08:31:50

0

的PriorityQueue是一个类AbstractCollection - 此具有几乎相同的接口到一个集。我敢肯定,制作一个将PriorityQueue转换为Set的包装会很容易。如果您确实需要强制执行该操作,则可以保留插入元素的边散列表以避免重复。

我不认为PriorityQueue要求compareTo与equals一致。 PriorityQueue根本不使用equals(除了继承的AbstractCollection操作?)。

+0

不,PriorityQueue没有一致性约束,但有排序集。我真的不想拥有两个相同元素的集合。 – Mauli 2009-12-10 08:29:23

2

TreeSet是一组提供了一个有序的迭代器。它实现了SortedSet接口,该接口保证iterator方法返回的迭代器将按照其自然排序(通过Comparable)确定的递增顺序返回集合的元素,或者通过创建集合时给定集合的比较器确定。

相关问题