java 集合转换_关于Java:如何将集合转换为列表?

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

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

Collection coll = themap.values();

这自然工作正常。

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

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

您可能希望通过直接使用某种SortedMap来避免此步骤,因此条目按所使用键的自然顺序排列。 Java自己的TreeMap实现SortedMap。

TreeBidiMap是OrderedMap,顺序应该可以。 问题中要求的排序是根据值而不是键。

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

只是要注意,这两种方法有不同的副作用:将集合转换为列表,然后排序还将对原始集合进行排序;创建副本不会。

如果重复使用,这种方法会大大降低性能。请参阅我的答案,以获取一种即时运行的解决方案,其中涉及一个自定义集合。

当map.values()返回"内部类"集合时,这不能解决问题。编译器报告Collections.sort(List < T >)不接受Collections.sort(List )。解决方案甚至是使用:List list = map.values()。stream()。collect(Collectors.toList())

这样的事情应该起作用,调用采用Collection的ArrayList构造函数:

List theList = new ArrayList(coll);

漂亮又简单。

这应该是公认的答案

最简单的答案,效果很好!谢谢。

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

我的建议是:

List list;

if (coll instanceof List)

list = (List)coll;

else

list = new ArrayList(coll);

Collections.sort(list);

我相信您可以这样写:

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

绕过铸造的更好方法

大!这解决了我的情况。我的map.values()返回一个"内部类"集合。编译器报告说Collections.sort(List < T >)不接受Collections.sort(List )。

缺少对访问ArrayList的引用?

@扎克:嗯,好点。我知道我有理由将其标记为CW。顺便说一句,Pauls ans是其中之一。我不知道他为什么只有我的紫外线。

@Kunigami:我认为您可能会误认为Guava的newArrayList方法。它不检查Iterable是否为List类型,而仅按原样返回给定的List。它总是创建一个新列表:

@GwtCompatible(serializable = true)

public static ArrayList newArrayList(Iterable extends E> elements) {

checkNotNull(elements); // for GWT

// Let ArrayList's sizing logic work, if possible

return (elements instanceof Collection)

? new ArrayList(Collections2.cast(elements))

: newArrayList(elements.iterator());

}

怎么还不投票呢? Kunigamis答案是错误的(就基本实现而言)。

您要求的操作成本很高,请确保您不需要经常执行此操作(例如,周期执行)。

否则,您可以创建一个自定义集合。我想出了一个将您的TreeBidiMap和TreeMultiset放在幕后的工具。仅实施您需要的内容,并关心数据完整性。

class MyCustomCollection implements Map {

TreeBidiMap map;

TreeMultiset 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.

}

这样,您就有了从values()返回的排序后的Multiset。但是,如果需要将其作为列表(例如,需要类似数组的get(index)方法),则必须发明一些更复杂的方法。

这是单线的次优解决方案:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值