Multithreading 使用并行排序和多个字段对列表进行排序
我有一个对象列表,我根据两个参数对该列表进行排序: 1.名字,和 2.姓 因此,要求是,首先根据名字对列表进行排序,然后根据姓氏进行排序 我使用Comparator.Comparing和Comparing方法实现了这一点,如下所示: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)
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
将以任意顺序打印元素……因此,正确的方法是收集到列表中?是否按排序的顺序打印?比较和的合同……当然,收集到列表中会生成顺序正确的列表,但这不是必需的,因为您只想打印元素。