如何将集合转换为列表?
我正在使用Apache Collections库中的TreeBidiMap
。 我想对这个doubles
的价值进行分类。
我的方法是检索一个值的Collection
使用:
Collection coll = themap.values();
这自然工作正常。
主要问题:我现在想知道如何将转换/转换(不知道哪个是正确的) coll
到一个List
以便它可以被sorting?
然后我打算遍历sortingTreeBidiMap
List
对象,它应该是按顺序的,并使用themap.getKey(iterator.next())
从TreeBidiMap
( themap
)中获取适当的键,其中迭代器将位于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一个自定义集合。 我想出了一个有你的TreeBidiMap
和TreeMultiset
的引擎盖。 只实施你所需要的并关心数据完整性。
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));