1

私はオブジェクトのリストを持っています。このリストは2つのパラメータに基づいてソートしています。 1.名字と 2.姓。並列ソートと複数のフィールドを使用してリストをソート

だから要件は、最初に姓に基づいてリストをソートし、姓に基づいて並べ替えます。

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

をして、それが非常に細かい作業をされています

私は次のようにComparator.compairingとthenCompairingメソッドを使用して、これを実装しました。

私が望むのは、複数のスレッドを使用して並行して並べ替える並列処理/並べ替えの概念を使用することです。どのようにこれを達成するための任意のアイデア?

答えて

3

わずかな変更が、これは同様に動作するはずです:

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

をあなたが見る - にstream()を回すのと同じくらい簡単かもしれないパラレルへの溶液を回す - それは、ストリームに関する美しさの一つでありますparallelStream()

しかし、いつものようにparallelStream使用して

  • は驚きのために準備する

    • 対策の効果とこれは、データをソートします
  • 0

    Iは次のように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共通プールは、任意の並列タスクを実行するために使用されます。

    これはこれは、同様streamsを使用することによって達成することができ、ここで

    0

    私の問題を解決します。 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-)の契約を比較してください。 and ['forEachOrdered'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#forEachOrdered-java.util.function)を参照してください。Consumer-)...もちろん、リストに集めることで、正しい順序でリストが作成されますが、要素を印刷したいときだけ必要です。 – Holger

    関連する問題