如何将集合转换为列表?

我正在使用Apache Collections库中的TreeBidiMap 。 我想对这个doubles的价值进行分类。

我的方法是检索一个值的Collection使用:

 Collection coll = themap.values(); 

这自然工作正常。

主要问题:我现在想知道如何将转换/转换(不知道哪个是正确的) coll到一个List以便它可以被sorting?

然后我打算遍历sortingTreeBidiMap List对象,它应该是按顺序的,并使用themap.getKey(iterator.next())TreeBidiMapthemap )中获取适当的键,其中迭代器将位于doubles列表之上。

 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); 

像这样的事情应该工作,调用ArrayList构造函数采取一个集合:

 List theList = new ArrayList(coll); 

我认为Paul Tomblin的回答可能是浪费的情况下,coll已经是一个列表,因为它会创build一个新的列表并复制所有的元素。 如果科尔包含许多元素,这可能需要很长时间。

我的build议是:

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

@Kunigami:我想你可能会误解Guava的newArrayList方法。 它不检查Iterable是否是一个Listtypes,只是简单地返回给定的List。 它总是创build一个新的列表:

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

我的解决scheme

 Collection<Type> name; List<Type> list = new ArrayList<>(); list.addAll(name); 

你所要求的是一个相当昂贵的操作,确保你不需要经常做(例如在一个循环中)。

否则,您可以创build一个自定义集合。 我想出了一个有你的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, eg count, isEmpty etc. } 

这样,你有一个从values()返回的sorting Multiset 。 但是,如果你需要它是一个列表(例如,你需要类似数组的get(index)方法),你就不得不发明更复杂的东西。

我相信你可以这样写:

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

这是一个单线的次优解决scheme:

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