gpt4 book ai didi

java - 使用比较器的 LinkedBlockingQueue

转载 作者:行者123 更新时间:2023-12-01 17:31:20 27 4
gpt4 key购买 nike

我正在使用 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 次,.. 并不是每次都调用相同的次数。我全部记录下来了,但我不明白。它不会比较所有内容。

请问大家有什么想法吗?从今天早上开始,我就试图解决这个问题,但无法进一步解决。

最佳答案

您当然可以创建自己的子类,通过覆盖 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)。

关于java - 使用比较器的 LinkedBlockingQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10580390/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com