我有一个通用链表:让我们在方法中说LinkedList<Comparable> cl
。如何并行排序此链接列表? Collections.sort()
不能并行。我能做的最接近的事情就是在Object之间使用Arrays.parallelSort()
进行未经检查的强制转换,但由于Java显然无法管理通用数组,因此会抛出ClassCastException
。
如何并行排序通用链接列表?
更重要的是,循环复制似乎有效,而列表连接却没有。为什么呢?
注意:这是在顺序排序之后。
我刚刚结束了这个:
for (Object o : poolarr) {
pool.add((O) o);
}
// can't do pool.addAll((O[]) Arrays.stream(poolarr));
我猜这是一个古老的阵列演员问题。
答案 0 :(得分:4)
在任何情况下,您都不会从链接列表中获得多少并行性,因为您无法轻易地将其分解。所以你可以这样做:
list.parallelStream().sorted().collect(toCollection(LinkedList::new));
但是我怀疑你会从并行中看到很多好处,因为分解链表的唯一选择是(首先,休息),这不会产生一个形状很好的计算树。
或者,您可以:
Comparable[] elems = list.stream().toArray(Comparable[]::new);
Arrays.parallelSort(elems);
这需要O(n)复制成本,但排序将很好地并行化。