14

TreeSetは、同じComprator値を持つさまざまなアイテムを削除します。削除したくない。これを制御する方法はありますか?または、別のコンテナクラスを使用しますか?

追加:OK。セットが使えないようです。パフォーマンスを考慮して、挿入ソート機能が必要です。リストはこれを行うことができますか?皆さんありがとう。

4

5 に答える 5

11

定義によるセットは、重複するエントリを持つことはできません。

したがって、リストや配列などを使用する必要があります

于 2011-05-05T09:34:05.087 に答える
6

セットであっても、オブジェクトが異なるため、混乱を招きます。たとえば、Set<E>異なるオブジェクトのaは、使用に基づいてEに変換されると、いくつかのオブジェクトをドロップします。どちらの場合もセットですが、格納される要素のセットは異なります。私の意見では、これはドキュメントでは十分に明確にされていません。TreeSet<E>Comparator<E>

簡単な解決策は、コンパレータを変更できる場合は、0を返さないようにすることです。たとえば、次の代わりに:

public int compare(Integer o1, Integer o2) {
    return o1.compareTo(o2);
}

使用する:

public int compare(Integer o1, Integer o2) {
    return o1 < o2 ? -1: 1;
}
于 2016-08-27T20:27:16.143 に答える
4

aの主な目的は、重複Setないようにすることです。が必要ないかSet、別のが必要ですComparator

于 2011-05-05T09:33:52.013 に答える
3

SetのJavadocからの引用:

重複する要素を含まないコレクション

Listの派生物を使用します。

于 2011-05-05T09:31:19.707 に答える
1

SortedListが必要な場合は、たとえばリストを取得し、挿入するたびに手動でCollections.sort()を呼び出すことができます。

または、たとえばArrayListをラップして、sort-callを確実に実行します。

    class SortedArrayList extends ArrayList<String> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void add(int index, String element) {
        super.add(index, element);
        Collections.sort(this);
    }

    @Override
    public boolean add(String element) {
        boolean returnValue = super.add(element);
        Collections.sort(this);
        return returnValue;
    }

    @Override
    public boolean addAll(Collection<? extends String> c) {
        boolean returnValue = super.addAll(c);
        Collections.sort(this);
        return returnValue;
    }

    @Override
    public boolean addAll(int index, Collection<? extends String> c) {
        boolean returnValue = super.addAll(index, c);
        Collections.sort(this);
        return returnValue;
    }

    @Override
    public String set(int index, String element) {
        String returnValue = super.set(index, element);
        Collections.sort(this);
        return returnValue;
    }
}

ソートが必要な関数がすべて揃っているといいのですが。(オーバーライドするために削除する必要はありません)

于 2015-07-13T05:11:49.120 に答える