并行排序的通用链表

时间:2014-06-06 03:06:54

标签: java data-structures parallel-processing java-8

我有一个通用链表:让我们在方法中说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));

我猜这是一个古老的阵列演员问题。

1 个答案:

答案 0 :(得分:4)

在任何情况下,您都不会从链接列表中获得多少并行性,因为您无法轻易地将其分解。所以你可以这样做:

list.parallelStream().sorted().collect(toCollection(LinkedList::new));

但是我怀疑你会从并行中看到很多好处,因为分解链表的唯一选择是(首先,休息),这不会产生一个形状很好的计算树。

或者,您可以:

Comparable[] elems = list.stream().toArray(Comparable[]::new);
Arrays.parallelSort(elems);

这需要O(n)复制成本,但排序将很好地并行化。