Java 泛型链表的并行排序
我有一个通用的链表:比如说在一个方法中的Java 泛型链表的并行排序,java,data-structures,parallel-processing,java-8,Java,Data Structures,Parallel Processing,Java 8,我有一个通用的链表:比如说在一个方法中的LinkedList cl。如何并行排序此链接列表Collections.sort()无法并行执行。我能做的最接近的事情是使用Arrays.parallelSort()在对象之间执行未经检查的强制转换,但由于Java显然无法管理泛型数组,这会引发ClassCastException 如何对通用链表进行并行排序? 更重要的是,循环复制似乎有效,而列表连接则无效。为什么? 注意:这是在顺序排序之后 我最终决定: for (Object o : poolarr
LinkedList cl
。如何并行排序此链接列表Collections.sort()
无法并行执行。我能做的最接近的事情是使用Arrays.parallelSort()
在对象之间执行未经检查的强制转换,但由于Java显然无法管理泛型数组,这会引发ClassCastException
如何对通用链表进行并行排序?
更重要的是,循环复制似乎有效,而列表连接则无效。为什么? 注意:这是在顺序排序之后 我最终决定:
for (Object o : poolarr) {
pool.add((O) o);
}
// can't do pool.addAll((O[]) Arrays.stream(poolarr));
我想这是一个由来已久的数组强制转换问题。无论如何,你都无法从链表中获得太多的并行性,因为你无法轻松地分解它。所以你可以做:
list.parallelStream().sorted().collect(toCollection(LinkedList::new));
但我怀疑你是否会从并行操作中看到很多好处,因为分解链表的唯一选择是(首先,rest),这不会生成一个形状良好的计算树
或者,您可以:
Comparable[] elems = list.stream().toArray(Comparable[]::new);
Arrays.parallelSort(elems);
这需要O(n)复制成本,但排序将很好地并行化。无论如何,链接列表都不会有太多并行性,因为您无法轻松分解它。所以你可以做:
list.parallelStream().sorted().collect(toCollection(LinkedList::new));
但我怀疑你是否会从并行操作中看到很多好处,因为分解链表的唯一选择是(首先,rest),这不会生成一个形状良好的计算树
或者,您可以:
Comparable[] elems = list.stream().toArray(Comparable[]::new);
Arrays.parallelSort(elems);
这需要O(n)复制成本,但排序将很好地并行化。请记住,我正在对泛型的链接列表进行排序。这真的不太好用。此外,链表排序也不会慢很多,因为
sort
方法首先将它们放入数组中。等等——它实际上是一个ArrayList
,但问题仍然存在。@Simon Kuang:第一种解决方案满足了您的要求list.parallelStream().sorted()
应用于链接列表将在内部将项目复制到数组中,并调用Arrays.parallelSort
。如果你坚持修改原始的列表
,你可以使用集合。之后复制(列表,列表)
。布莱恩,我很惊讶你会写出答案。记住,我正在对一个泛型的链接列表进行排序。这真的不太好用。此外,链表排序也不会慢很多,因为sort
方法首先将它们放入数组中。等等——它实际上是一个ArrayList
,但问题仍然存在。@Simon Kuang:第一种解决方案满足了您的要求list.parallelStream().sorted()
应用于链接列表将在内部将项目复制到数组中,并调用Arrays.parallelSort
。如果你坚持修改原始的列表
,你可以使用集合。之后复制(列表,列表)
。布莱恩,我很惊讶你会写出答案。