Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型链表的并行排序_Java_Data Structures_Parallel Processing_Java 8 - Fatal编程技术网

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
。如果你坚持修改原始的
列表
,你可以使用
集合。之后复制(列表,列表)
。布莱恩,我很惊讶你会写出答案。