使用Comparator的LinkedBlockingQueue

CC.*_*CC. 0 java queue comparator

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

SortedSet<ResultInsert> set = new TreeSet<ResultInsert>(new MyComparator());
set.addAll(bulkInserts);
Run Code Online (Sandbox Code Playgroud)

并实施:

@Override
    public int compare(ResultInsert arg0, ResultInsert arg1) {

}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它似乎没有将我的集合中的每个元素与所有元素进行比较.例如,我有61个元素,它消除了一些重复,我有51个元素,除了在这51个之间还有一些重复.

我刚刚做了一个测试:对于61个对象,它调用了342次,351次,...不是每次都相同的次数.我记录了所有,我没有得到它.它并不能比较所有.

请问有什么想法吗?从今天早上开始,我正试图解决这个问题,我无法继续前进.

aio*_*obe 5

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

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

如果你真的需要使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,向队列添加元素将成为线性操作.如果您希望获得更好的性能,则必须维护单独的数据结构(例如HashSet).