12

Listaから aを取得Setし、指定された に対してソートするための「良い」(そしてその理由は?) ソリューションは何Comparatorですか?

4

5 に答える 5

13
Set<Object> set = new HashSet<Object>();

// add stuff

List<Object> list = new ArrayList<Object>(set);
Collections.sort(list, new MyComparator());
于 2010-10-13T12:14:47.010 に答える
6

構築するだけです。ArrayListには、別のを受け取るコンストラクターがCollectionあります。

Set<Foo> set = new TreeSet<Foo>(new FooComparator<Foo>());
// Fill it.

List<Foo> list = new ArrayList<Foo>(set);
// Here's your list with items in the same order as the original set.
于 2010-10-13T12:12:27.143 に答える
2

また:

Set<X> sortedSet = new TreeSet<X>(comparator); ...
List<X> list = new ArrayList<X>(sortedSet);

また:

Set<X> unsortedSet = new HashSet<X>(); ...
List<X> list = new ArrayList<X>(unsortedSet);
Collections.sort(list, comparator);
于 2010-10-13T12:24:10.337 に答える
1

ソートされていないセットまたは別の順序でソートされたセットから開始すると仮定すると、変更可能なリストが必要であると仮定すると、おそらく次の方法が最も効率的です。

Set<T> unsortedSet = ... 
List<T> list = new ArrayList<T>(unsortedSet); 
Collections.sort(list, comparator);

変更不可能なリストが受け入れられる場合は、次のほうが少し高速です。

Set<T> unsortedSet = ... 
T[] array = new T[unsortedSet.size()];
unsortedSet.toArray(array);
Arrays.sort(array, comparator);
List<T> list = Arrays.asList(array);

最初のバージョンではCollections.sort(...)、リストの内容を配列にコピーし、配列をソートして、ソートされた要素をリストにコピーして戻します。2 番目のバージョンは、並べ替えられた要素をコピーする必要がないため、高速です。

しかし、正直なところ、パフォーマンスの違いはおそらく重要ではありません。実際、入力セットのサイズが大きくなるにつれて、パフォーマンスはO(NlogN)ソートを行う時間によって支配されます。コピー手順はO(N)、N が大きくなるにつれて重要性が低下します。

于 2010-10-13T13:26:34.910 に答える
0

これは、 があるListときにを取得する方法Setです。

List list = new ArrayList(set);

で何を期待しているのかわかりませんComparator。がソートされている場合Set、リストにはソートされた順序で要素が含まれます。

于 2010-10-13T12:12:29.180 に答える