2009-02-24 9 views
202

Apache CollectionsライブラリのTreeBidiMapを使用しています。私はdoublesの値でこれを並べ替えたいと思います。コレクションをリストに変換するには?

私の方法は、使用して値のCollectionを取得するために、次のとおりです。自然に正常に動作します

Collection coll = themap.values(); 

主な質問:私は今、私は/キャスト(正しいかわからない)collはそれをソートすることができますListに変換する方法を知りたいですか?

Iは次に順序であるとイテレータがdoublesのリスト上であろうthemap.getKey(iterator.next())を用いTreeBidiMapthemap)から適切なキーを取得する必要がソートListオブジェクトを反復処理するつもり。

+4

あなたは直接のSortedMapのいくつかの種類を使用してこの手順を避けたいと思うかもしれませんので、エントリが使用されているキーの自然順序になっています。 Java独自のTreeMapはSortedMapを実装します。 –

+0

'TreeBidiMap'は' OrderedMap'です。順序はokです。質問に必要な並べ替えは、キーではなく値で行われます。 – Vlasec

答えて

365
List list = new ArrayList(coll); 
Collections.sort(list); 

Erel Segal Haleviは以下のように、collが既にリストである場合、ステップ1をスキップできます。しかし、それはTreeBidiMapの内部構造に依存します。

List list; 
if (coll instanceof List) 
    list = (List)coll; 
else 
    list = new ArrayList(coll); 
+1

2つのアプローチに異なる副作用があることに注意してください。コレクションをリストにキャストし、ソートすると元のコレクションもソートされます。コピーを作成することはできません。 – Barney

+0

この手法は、繰り返し使用するとパフォーマンスが大幅に低下します。オンザフライで動作するソリューションについては私の答えをご覧ください。カスタムコレクションが含まれています。 – Vlasec

58

このようなものは、コレクションをとるArrayList constructorを呼び出して、動作するはずです:

List theList = new ArrayList(coll); 
7
Collections.sort(new ArrayList(coll)); 
+0

ArrayListにアクセスするための参照がありませんか? –

+0

@Zach:mmhh良い点。私はこれをCWとマークする理由があることを知っていました。 BTWポールのansは1つです。なぜ彼は私のuvだけを持っているのか分かりません。 – OscarRyz

29

私はポールTomblinの答えは、ケース・高専に無駄かもしれないと思う、それはするので、すでにリストです新しいリストを作成し、すべての要素をコピーします。 collに多くの要素が含まれていると、時間がかかることがあります。

私の提案は次のとおりです。

List list; 
if (coll instanceof List) 
    list = (List)coll; 
else 
    list = new ArrayList(coll); 
Collections.sort(list); 
4

@Kunigami:私はあなたがグアバのnewArrayList方法についての誤解かもしれないと思います。 IterableがList型であるかどうかはチェックせず、指定されたListをそのまま返すだけです。それ常には、新しいリストを作成します。ここでは

@GwtCompatible(serializable = true) 
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) { 
    checkNotNull(elements); // for GWT 
    // Let ArrayList's sizing logic work, if possible 
    return (elements instanceof Collection) 
     ? new ArrayList<E>(Collections2.cast(elements)) 
     : newArrayList(elements.iterator()); 
} 
+0

これはどのように投票していないのですか?国会の答えは間違っています(基本的な実装についての限り)。 – GreenieMeanie

-1

はワンライナーとしてサブ最適なソリューションです:あなたはかなりcosty操作で要求

Collections.list(Collections.enumeration(coll)); 
1

何を、あなたはドン作ります」それを頻繁に(例えばサイクルで)行う必要があります。

それ以外の場合は、カスタムコレクションを作成できます。あなたのTreeBidiMapTreeMultisetがフードの下にあるものを思いついた。必要なものだけを実装し、データの完全性を気にしてください。

class MyCustomCollection implements Map<K, V> { 
    TreeBidiMap<K, V> map; 
    TreeMultiset<V> multiset; 
    public V put(K key, V value) { 
     removeValue(map.put(key, value)); 
     multiset.add(value); 
    } 
    public boolean remove(K key) { 
     removeValue(map.remove(key)); 
    } 
    /** removes value that was removed/replaced in map */ 
    private removeValue(V value) { 
     if (value != null) { 
      multiset.remove(value); 
     } 
    } 
    public Set keySet() { 
     return map.keySet(); 
    } 
    public Multiset values() { 
     return multiset; 
    } 
    // many more methods to be implemented, e.g. count, isEmpty etc. 
} 

このように、あなたはvalues()から返さMultisetをソートしています。しかし、それをリストにする必要がある場合(たとえば、配列のような配列get(index)が必要な場合)、より複雑なものを作成する必要があります。

4

私はあなたがそのように書くことができると信じて:

coll.stream().collect(Collectors.toList()) 
+0

キャスティングをもっと楽にする – Stackee007

関連する問題