如何将集合转换为列表?

时间:2009-02-24 01:56:11

标签: java list sorting collections apache-commons-collection

我正在使用Apache Collections库中的TreeBidiMap。我想对doubles的值进行排序。

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

Collection coll = themap.values();

这自然很好。

主要问题:我现在想知道如何将coll转换/转换(不确定哪个是正确的)List以便对其进行排序?

然后我打算迭代排序的List对象,该对象应该按顺序排列并使用TreeBidiMapthemapthemap.getKey(iterator.next()))获取相应的密钥。迭代器将在doubles列表上。

11 个答案:

答案 0 :(得分:431)

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 :(得分:84)

这样的事情应该有效,调用带有集合的ArrayList constructor

List theList = new ArrayList(coll);

答案 2 :(得分:32)

我认为Paul Tomblin的答案可能是浪费,以防coll已经是一个列表,因为它将创建一个新列表并复制所有元素。如果coll包含许多元素,这可能需要很长时间。

我的建议是:

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

答案 3 :(得分:13)

我相信你可以这样写:

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

答案 4 :(得分:7)

Collections.sort( new ArrayList( coll ) );

答案 5 :(得分:6)

Java 10引入了constraints -> primary key,它在保留顺序的同时返回不可修改的列表

List#copyOf

答案 6 :(得分:4)

@Kunigami:我认为你可能会误认为是Guava的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());
}

答案 7 :(得分: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.
}

这样,您就可以从Multiset返回已排序 values()。但是,如果您需要它作为列表(例如,您需要类似于数组的get(index)方法),那么您必须发明更复杂的内容。

答案 8 :(得分:0)

使用流:

someCollection.stream().collect(Collectors.toList())

答案 9 :(得分:0)

Java 8 以后...

您可以使用StreamsCollectors.toCollection() 将集合转换为任何集合(即列表、集合和队列)。

考虑以下示例地图

Map<Integer, Double> map = Map.of(
    1, 1015.45,
    2, 8956.31,
    3, 1234.86,
    4, 2348.26,
    5, 7351.03
);

到ArrayList

List<Double> arrayList = map.values()
                            .stream()
                            .collect(
                                Collectors.toCollection(ArrayList::new)
                            );
<块引用>

输出:[7351.03, 2348.26, 1234.86, 8956.31, 1015.45]

到Sorted ArrayList(升序)

List<Double> arrayListSortedAsc = map.values()
                                        .stream()
                                        .sorted()
                                        .collect(
                                            Collectors.toCollection(ArrayList::new)
                                        );
<块引用>

输出:[1015.45, 1234.86, 2348.26, 7351.03, 8956.31]

到已排序的ArrayList(降序)

List<Double> arrayListSortedDesc = map.values()
                                        .stream()
                                        .sorted(
                                            (a, b) -> b.compareTo(a)
                                        )
                                        .collect(
                                            Collectors.toCollection(ArrayList::new)
                                        );
<块引用>

输出:[8956.31, 7351.03, 2348.26, 1234.86, 1015.45]

链接列表

List<Double> linkedList = map.values()
                                .stream()
                                .collect(
                                    Collectors.toCollection(LinkedList::new)
                                );
<块引用>

输出:[7351.03, 2348.26, 1234.86, 8956.31, 1015.45]

到哈希集

Set<Double> hashSet = map.values()
                            .stream()
                            .collect(
                                Collectors.toCollection(HashSet::new)
                            );
<块引用>

输出:[2348.26, 8956.31, 1015.45, 1234.86, 7351.03]

到PriorityQueue

PriorityQueue<Double> priorityQueue = map.values()
                                            .stream()
                                            .collect(
                                                Collectors.toCollection(PriorityQueue::new)
                                            );
<块引用>

输出:[1015.45, 1234.86, 2348.26, 8956.31, 7351.03]

参考

Java - Package java.util.stream

Java - Package java.util

答案 10 :(得分:-3)

这是一个次优的解决方案:

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