1

我有一個對象列表,我基於兩個參數排序此列表: 1.名字和 2.姓氏。使用並行排序和多個字段排序列表

所以要求就是,首先根據姓氏排序列表並根據姓氏排序。

我已經實現這個使用Comparator.compairing和thenCompairing方法如下:

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

和,這是工作非常精細。

現在我想要的是使用並行處理/排序的概念進行並行排序,使用多線程或多線程環境。任何想法如何實現這一目標?

回答

3

一個稍微的改變,但這應該工作以及:

List<Employee> sortedEmployees = employees.parallelStream() 
    .sorted(Comparator.comparing(Employee::getFirstName) 
        .thenComparing(Employee::getLastName)) 
    .collect(Collectors.toList()); 

你看 - 這是關於流的美女之一 - 把一個解決方案成平行可能是因爲轉向stream()成那樣簡單parallelStream()

但使用parallelStream時,像往常一樣:

  • 措施及其效果
  • 來迎接驚喜準備和需要微調
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公共池用於執行任何並行任務。

這將解決這裏

0

我的問題,這可以通過使用streams也可以實現。通過使用streams,我們不需要在排序之前將List複製到數組。

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

sorted.forEachOrdered(System.out::println); 
+0

這將會對數據進行排序,然後,'的forEach '會以任意順序打印元素... – Holger

+0

那麼,正確的方法是收集到一個列表?這是否按排序順序打印? – Jagannath

+0

比較['forEach']的合約(https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#forEach-java.util.function.Consumer-)和['forEachOrdered'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#forEachOrdered-java.util.function。消費者 - )......當然,收集到列表中會按照正確的順序產生一個列表,但當您只想打印元素時,這不是必需的。 – Holger