2009-02-24 66 views
202

我使用Apache Collections庫中的TreeBidiMap。我想對doubles的值進行排序。如何將集合轉換爲列表?

我的方法是檢索使用的值的Collection

Collection coll = themap.values(); 

這自然正常工作。

主要問題:我現在想知道我怎麼可以轉換/施放(不知道這是正確的)collList所以它可以進行排序?

然後我打算遍歷排序List對象,這應該是爲了,並從TreeBidiMapthemap)使用themap.getKey(iterator.next())適當的鍵在迭代器將超過doubles列表。

+4

你可能想避免這一步驟,直接利用某種SortedMap的,所以條目中所使用的密鑰的自然順序。 Java自己的TreeMap實現SortedMap。 – 2011-07-24 10:41:52

+0

`TreeBidiMap`是一個`OrderedMap`,順序應該沒問題。問題中所需的排序依賴於值,而不是按鍵。 – Vlasec 2015-05-28 15:01:13

回答

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

正如Erel Segal Halevi所說,如果coll已經是一個列表,您可以跳過第一步。但是,這取決於TreeBidiMap的內部。

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

只是要注意,這兩種方法有不同的副作用:將集合投射到列表,然後排序也會對原始集合進行排序;創建副本不會。 – Barney 2015-12-16 01:25:25

+0

如果反覆使用,這種方法會大大降低性能。查看我的答案,找到可即時運行的解決方案,它涉及一個自定義集合。 – Vlasec 2016-08-02 11:30:49

58

像這樣的事情應該工作,調用,需要一個集合了ArrayList constructor

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

缺少訪問ArrayList的引用? – 2009-02-24 02:15:37

29

我認爲保羅湯布林的回答可能的情況下,科爾浪費已經是一個列表,因爲它會創建一個新列表並複製所有元素。如果科爾包含許多元素,這可能需要很長時間。

我的建議是:

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()); 
} 
-1

這裏是一個次優的解決方案作爲一個班輪:

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

你要求什麼是一個相當costy時,要確保你不」 t需要經常做(例如在一個循環中)。

否則,您可以創建自定義集合。我想出了一個有你的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. 
} 

這樣,你有一個分類Multisetvalues()返回。但是,如果你需要它是一個列表(例如,你需要類似於數組的get(index)方法),你將不得不發明更復雜的東西。

4

我相信你可以把它寫成這樣:

coll.stream().collect(Collectors.toList()) 
相關問題