0

を使用して、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回、..毎回同じ回数ではありません。すべてログに記録しましたが、わかりません。すべてを比較するわけではありません。

どなたかアイデアをお願いします。今朝からこれを解決しようとしていますが、それ以上先に進むことができません。

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 に答える