我正在使用LinkedBlockingQueue
在线程之间共享一些对象。
问题是我可以在这个队列中有一些重复。
我试过这个解决方案:
SortedSet<ResultInsert> set = new TreeSet<ResultInsert>(new MyComparator());
set.addAll(bulkInserts);
并实施:
@Override
public int compare(ResultInsert arg0, ResultInsert arg1) {
}
出于某种原因,它似乎没有将我的集合中的每个元素与所有元素进行比较。 例如,我有61个元素,它消除了一些重复,我有51个元素,除了在这51个之间还有一些重复。
我刚做了一个测试:对于61个对象,它调用了342次,351次,而不是每次都是相同的次数。 我记录了所有,我没有得到它。它并不能比较所有。
有任何想法,拜托?从今天早上开始,我正试图解决这个问题,我不能再进一步了。
答案 0 :(得分:5)
当然,您可以通过覆盖put
来创建自己的子类,以防止重复插入,如果队列中存在给定元素,则忽略该调用。
class NoDupBlockingQueue<T> extends LinkedBlockingQueue<T> {
@Override
public void put(T e) throws InterruptedException {
if (!contains(e))
super.put(e);
}
}
如果你真的需要使用Comparator
,可以这样写:
class NoDupBlockingQueue<T> extends LinkedBlockingQueue<T> {
Comparator<T> comp;
public NoDupBlockingQueue(Comparator<T> comp) {
this.comp = comp;
}
@Override
public void put(T e) throws InterruptedException {
for (T e2 : this)
if (comp.compare(e, e2) == 0)
return;
super.put(e);
}
}
请注意,向队列添加元素将成为线性操作。如果您希望获得更好的性能,则必须维护一个单独的数据结构(例如HashSet)。