使用并行排序和多个字段对列表进行排序

时间:2017-07-26 10:52:22

标签: multithreading sorting parallel-processing java-8 comparator

我有一个对象列表,我根据两个参数对此列表进行排序: 1.名字,和 2.姓氏。

所以要求就是这样,首先根据名字对列表进行排序,然后根据姓氏进行排序。

我使用Comparator.compairing和thenCompairing方法实现了这个,如下所示:

Comparator<Employee> groupComparator = Comparator.comparing(Employee::getFirstName)
                                                .thenComparing(Employee::getLastName);

并且,它工作得非常好。

现在我想要的是使用并行处理/排序的概念,使用多线程或在多线程环境中并行排序。知道如何实现这个目标吗?

3 个答案:

答案 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);