0

我正在使用 aLinkedBlockingQueue在线程之间共享一些对象。问题是我可以在这个队列中有一些重复。我试过这个解决方案:

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 次、.. 不是每次都相同的次数。我记录了所有,我不明白。它不比较所有。

请问有人有什么想法吗?从今天早上开始,我正在尝试解决这个问题,但我不能再进一步了。

4

1 回答 1

5

您当然可以创建自己的子类来防止重复插入,put如果给定元素存在于队列中,则通过覆盖并忽略调用。

class NoDupBlockingQueue<T> extends LinkedBlockingQueue<T> {
    @Override
    public void put(T e) throws InterruptedException {
        if (!contains(e))
            super.put(e);
    }
}

如果你真的需要使用 a 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)。

于 2012-05-14T09:15:47.113 回答