3

多数のデータ構造を生成するアプリケーションを想定しますHashMap<String, MyClass>。各データ構造には、数十から数百Comparableのタイプのオブジェクトが含まMyClassれ、最終的には1つのソートされたオブジェクトになる必要がありCollectionます。

この機能の2つの可能な実装は、次のように、SortedSetまたはSortedListを返します。

public static Set<MyClass> getSortedSet(HashMap<String, MyClass>... allMaps)
{
    SortedSet<MyClass> set = new TreeSet<MyClass>();

    Collection<MyClass> c;

    for (HashMap<String, MyClass> map:allMaps)
    {
        c = map.values();
        set.addAll(c);
    }

    return set;
}

public static List<MyClass> getSortedList(HashMap<String, MyClass>... allMaps)
{
    List<MyClass> list = new ArrayList<MyClass>();

    Collection<MyClass> c;

    for (HashMap<String, MyClass> map:allMaps)
    {
        c = map.values();
        list.addAll(c);
    }

    Collections.sort(list);

    return list;
}

上記の2つの方法のいずれかに明確なパフォーマンス上の利点はありますか?

同じ機能を実装するより速い方法はありますか?

4

3 に答える 3

4

ソート済みリストメソッドに関するいくつかの問題:

ArrayListsは配列によって支えられています。新しい要素を追加するときはいつでも、舞台裏で配列を拡大する必要があるかもしれません。このアプローチを使用する場合は、事前に適切なサイズのArrayListを作成する必要があります。

すべての要素を追加した後の並べ替えは最適ではないようです。リストの正しい位置に要素を追加してみませんか?(ソートされたコレクションを使用してからリストに変換します)Javaに適したソート済みリスト

実際にあなたの質問に答えるために、私は舞台裏でTreeSetを使用するアプローチを使用します。なぜなら、ユーザーが望むなら、いつでもSet.toArray()を実行して、リストを作成できるからです。

于 2012-05-14T14:00:38.260 に答える
2

セットとリストは、その性質によって意味が異なります。セットは重複を保持しません。オブジェクトのインスタンスは1つだけ持つことができます。リストを使用すると、重複を保持できます。

そのため、セットはより多くの作業を行うため、処理が遅くなります。

于 2012-05-14T13:51:04.607 に答える
2

一方の実装が常に他方よりも高速であると想定する理由はありますか?

いいえ、それを仮定する理由はありません。

どちらが速いかは、データの量、そのプロパティ、コンパレータのパフォーマンス特性、JDK、JITコンパイラなどに依存する可能性があります。

確実に知る唯一の方法は、現実的なデータでコードをベンチマークすることです。

于 2012-05-14T13:55:55.237 に答える