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

Multithreading 使用并行排序和多个字段对列表进行排序,multithreading,sorting,parallel-processing,java-8,comparator,Multithreading,Sorting,Parallel Processing,Java 8,Comparator,我有一个对象列表,我根据两个参数对该列表进行排序: 1.名字,和 2.姓 因此,要求是,首先根据名字对列表进行排序,然后根据姓氏进行排序 我使用Comparator.Comparing和Comparing方法实现了这一点,如下所示: Comparator<Employee> groupComparator = Comparator.comparing(Employee::getFirstName)

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

因此,要求是,首先根据名字对列表进行排序,然后根据姓氏进行排序

我使用Comparator.Comparing和Comparing方法实现了这一点,如下所示:

Comparator<Employee> groupComparator = Comparator.comparing(Employee::getFirstName)
                                                .thenComparing(Employee::getLastName);
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);
Comparator-groupComparator=Comparator.comparating(Employee::getFirstName)
.Then比较(雇员::getLastName);
而且,它工作得非常好


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

我使用Arrays.parallelSort方法得到了解决方案,如下所示:

Comparator<Employee> groupComparator = Comparator.comparing(Employee::getFirstName)
                                                .thenComparing(Employee::getLastName);
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);
List emps=getEmployees();
Comparator groupComparator=Comparator.comparing(Employee::getFirstName)
.Then比较(雇员::getLastName);
Employee[]empArr=employees.toArray(新员工[emps.size()]);
//并行排序
parallelSort(empArr、groupComparator);
已添加java 8,根据文档:

排序算法是一种并行排序合并,它将数组拆分为子数组,这些子数组本身进行排序,然后进行合并。当子数组长度达到最小粒度时,将使用适当的Arrays.sort方法对子数组进行排序。如果指定数组的长度小于最小粒度,则使用适当的Arrays.sort方法对其进行排序。该算法需要的工作空间不大于原始数组的大小。ForkJoin公共池用于执行任何并行任务


它将解决我在这里的问题

这也可以通过使用
来实现。通过使用
我们不需要在排序之前将
列表
复制到数组中

Stream<Employee> sorted = employees.stream()
                                   .sorted(Comparator.comparing(Employee::getFirstName)
                                   .thenComparing(Employee::getLastName))   
                                   .parallel();   

sorted.forEachOrdered(System.out::println);
Stream sorted=employees.Stream()
.sorted(Comparator.comparing(Employee::getFirstName)
.Then比较(雇员::getLastName))
.parallel();
排序。forEachOrdered(System.out::println);

稍微修改一下,但也应该可以:

List<Employee> sortedEmployees = employees.parallelStream()
   .sorted(Comparator.comparing(Employee::getFirstName)
                     .thenComparing(Employee::getLastName))
   .collect(Collectors.toList());
List sortedEmployees=employees.parallelStream()
.sorted(Comparator.comparing(Employee::getFirstName)
.Then比较(雇员::getLastName))
.collect(Collectors.toList());
你看,这是流的魅力之一——将解决方案转换为并行可能很简单,就像将
stream()
转换为
parallelStream()

但与往常一样,使用并行流时:

  • 衡量其影响
  • 为惊喜和微调的需要做好准备

这将对数据进行排序,然后,
forEach
将以任意顺序打印元素……因此,正确的方法是收集到列表中?是否按排序的顺序打印?比较和的合同……当然,收集到列表中会生成顺序正确的列表,但这不是必需的,因为您只想打印元素。