我正在使用来自Apache集合库的TreeBidiMap。我想对double类型的值进行排序。

我的方法是检索值的集合使用:

Collection coll = themap.values();

这很正常。

主要问题:我现在想知道我如何转换/cast(不确定哪个是正确的)coll成一个列表,这样它就可以排序?

然后,我打算遍历排序的List对象,它应该是有序的,并使用themap. getkey (iterator.next())从TreeBidiMap (themap)中获得适当的键,其中迭代器将在double列表上。


当前回答

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

其他回答

Collections.sort( new ArrayList( coll ) );

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

我的建议是:

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

Java 8开始…

您可以使用Streams和collections . tocollection()将Collection转换为任何集合(即List, Set和Queue)。

考虑下面的示例地图

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

对数组列表

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

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

排序数组列表(升序)

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

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

排序数组列表(降序)

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]

对HashSet

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 -包Java .util.stream

Java - Java .util包

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

使用流:

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