List
aから aを取得Set
し、指定された に対してソートするための「良い」(そしてその理由は?) ソリューションは何Comparator
ですか?
21613 次
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 に答える