我有一个对象列表,我根据两个参数对此列表进行排序: 1.名字,和 2.姓氏。
所以要求就是这样,首先根据名字对列表进行排序,然后根据姓氏进行排序。
我使用Comparator.compairing和thenCompairing方法实现了这个,如下所示:
Comparator<Employee> groupComparator = Comparator.comparing(Employee::getFirstName)
.thenComparing(Employee::getLastName);
并且,它工作得非常好。
现在我想要的是使用并行处理/排序的概念,使用多线程或在多线程环境中并行排序。知道如何实现这个目标吗?
答案 0 :(得分:3)
稍作修改,但这也应该有效:
List<Employee> sortedEmployees = employees.parallelStream()
.sorted(Comparator.comparing(Employee::getFirstName)
.thenComparing(Employee::getLastName))
.collect(Collectors.toList());
你知道 - 这是关于流的美丽之一 - 将解决方案转换为并行可能就像将stream()
转变为parallelStream()
一样简单!
但是像往常一样使用 parallelStream :
答案 1 :(得分:0)
我使用Arrays.parallelSort方法得到了解决方案,如下所示:
List<Employee> emps = getEmployees();
Comparator<Employee> groupComparator = Comparator.comparing(Employee::getFirstName)
.thenComparing(Employee::getLastName);
Employee[] empArr = employees.toArray(new Employee[emps.size()]);
//Parallel sorting
Arrays.parallelSort(empArr, groupComparator);
已添加java 8并根据文档:
排序算法是一种并行排序合并,它将数组分解为自身排序然后合并的子数组。当子阵列长度达到最小粒度时,使用适当的Arrays.sort方法对子阵列进行排序。如果指定数组的长度小于最小粒度,则使用适当的Arrays.sort方法对其进行排序。该算法需要的工作空间不大于原始数组的大小。 ForkJoin公共池用于执行任何并行任务。
这将解决我的问题
答案 2 :(得分:0)
这也可以通过使用streams
来实现。使用streams
我们不需要在排序之前将List
复制到数组。
Stream<Employee> sorted = employees.stream()
.sorted(Comparator.comparing(Employee::getFirstName)
.thenComparing(Employee::getLastName))
.parallel();
sorted.forEachOrdered(System.out::println);