ソート(配列、リスト、ストリームソート)を詳しく説明し、物品のソートマップを作成する[Javaの]強制

#ジェーンは、生活の中で多くのそのような例があるので、ソート、非常に一般的な使用シナリオであると述べました。全国GDPランキング、両方のダイナミックでなく、圧力を与えるオリンピックメダルのランキング、ランキングや他のスターのファン、チャート、。そして、ソートの話、ソートアルゴリズムおよび関連する実装の様々ながあるでしょう、私たちはどのソートアルゴリズムを話すが、唯一話すの使用に焦点を当てていません。お見せする例として、私たちは、ソートする既存のツールの使用方法を理解することができます。Linuxの父は言った:>トーク安いショーの私のコードの記事JDKのバージョンのJava 8であるが、それは唯一のJDK1.8で実行するように説明した方法の全て、以前のバージョンのメソッドの一部が与えられていることを意味するものではありません。!アウト。次の表の統合、法の数字は、あなたが簡単にハハ、ほとんどのシーンに対処し、すぐにカバーすることができますことを忘れないでください![Javaのソート](https://img2018.cnblogs.com/blog/946674/201910/ 946674-20191013201113220-1353805276.jpg)---###二つのインタフェースコードに匹敵: `` `のJavaパッケージjava.lang;匹敵公開インタフェース {パブリックINTのcompareTo(T O);} `インターフェースのみ1つのパラメータが、比較することができ、このインタフェースと同様のを実装する方法を有することがわかります。このメソッドは実装されているが、法律の比較である、それは二つのオブジェクトを比較する方法を示していることです。これは、整数intを返し: - 現在のオブジェクトを表す正の数が比較対象よりも大きい戻り; - 現在のオブジェクトが比較される対象と等しい表し、0を返し、 - ネガティブを返し、現在のオブジェクトは、代表的なオブジェクトが比較さ未満です。実装このインタフェースの後、我々はアップソートするは、Arrays.sort()とCollections.sort()を使用することができます。それ以外の場合は、オブジェクトが比較ルールではありません、手順は確かにソートを比較する方法がわかりません。私たちは、Stringクラスなどの整数、ダブル、日付を、使用のように、JDKは私たちがComparableインタフェースを達成するために役立った、我々は直接比較するオブジェクトのこのタイプを並べ替えることができます。例えば、日匹敵実装: `` `のJava公共int型のcompareTo(日anotherDate){長いthisTime = getMillisOf(この);長anotherTime = getMillisOf(anotherDate);リターン(thisTime {intは(T O1、T 02)を比較;} ``それはインタフェースの関数である `、その比較方法は、2つのパラメータ、2つの比較オブジェクトの代表を有します。このインタフェースは、オブジェクトのいくつかの種類は、比較法として使用することができる表し、又は戦略と呼ばれます。これは、正と負のセンスアプローチを表し、同等インターフェースが同じ値を返します。その使用は通常、三つの方法があります:1.匿名実装クラス2クラス3ラムダ式Java8の後に、我々は一般的に、よりラムダを使用するだけでなく、より柔軟かつエレガント。## 2は、二つのインタフェース機能インターフェースは、ソートを比較するために使用される比較が、実際には大きな違いがあります。異なるパラメータの1両方の方法は、方法を比較するため、比較対象のオブジェクトを表す匹敵する唯一のパラメータがあれば上のパラメータとして、クラスに位置して、コンパレータの比較方法、2つのパラメータが存在します、それぞれ、比較のための比較対象。同等のオブジェクト内に配置されたオブジェクトとの結合、我々は**コンパレータを呼び出すことができる2、及び比較器が比較すべきクラスとは独立している、我々は**外部の比較器と呼ぶことができます。3。クラスがセットに匹敵する方法、比較法を実装した場合、我々は呼ん**自然の比較方法は、我々はそれが比較の様々な方法を達成与えることができない、と外のコンパレータ独立しているので、私たちは、同じクラスを提供することができますコンパレータの実装の様々なので、このような逆の昇順として比較方法/戦略、さまざまなを提供するために、私たちはコンパレータモード** **戦略として見ることができます。相対的な比較可能に、クラスはComparableインタフェースを実装していない場合には、ある程度の柔軟性をコンパレータとクラスが変更することはできません、私たちは、コンパレータを提供することにより、ソート比較することになります。このモデルは、メンテナンスのためのデータとアルゴリズムのデカップリングを実現コンパレータにも非常に便利です。---#ツールは非常にフレンドリーで、JDKが私たちのためのツールを提供し、彼らは静的メソッドで配列やリストをソートするために、直接私たちを助けることができます。配列配列ソートアレイ##ソート方法ソートが同等のインタフェースを達成してもよいが、またソートする範囲を指定することができます。文字列[]の文字列は=の `のJava //Arrays.sortソート{ "デ"、 "DC"、 "AA"、 "K"、 "B" "として"};は、Arrays.sort(文字列) ;いるassertTrue(をArrays.equals(文字列、新しいString [] { "AS"、 "AA"、 "B"、 "DC"、 "ド"、 "K"})); ``指定された範囲の順序、ノート、たfromIndexを含むゼロからインデックスカウントされ、toIndexのを含まない: `` `のJava //Arrays.sort指定された範囲のソート列=新しいString [] { "Z"、」"" D "" B "};は、Arrays.sort(文字列、0、3);いるassertTrue(をArrays.equals(文字列、新しいString [] {" A "" D "" Z "" B 「})); `プリミティブ型のために、注文することができるように、カプセル化されたクラスの使用を必要としない` ``基本的なint型のJavaの//Arrays.sortソートを[] NUMS = {3、1、20、2 、38、2、94};は、Arrays.sort(NUMS);いるassertTrue(をArrays.equals(NUMS、新しいINT [] {1、2、2、3、20、38、94})); `もマルチスレッド・ソート、実際には、サブアレイの複数に分割されてソートされ、最終的に結果をマージする。 `` `のJava //Arrays.parallelSortマルチスレッドソートNUMS =新しいINT [] {3、1、20、2、38 、2、94}; Arrays.parallelSort(NUMS);いるassertTrue(をArrays.equals(NUMS、新しいINT [] {1、2、2、3、20、38、94})); `Comparableを実装しないように次のとおりであり、彼らはComparableインタフェースのクラスPersonを実装していないポリシーコンパレータを指定するための比較を行う場合、クラスを使用してもよい: `` `Javaのimport lombok.AllArgsConstructor;輸入lombok.Data; @Data @AllArgsConstructorパブリッククラスPerson {プライベート文字列。名;プライベートint型の年齢;} `` `並び替え:` `` Javaの//配列 ソートコンパレータソート人[]人が=新しい人[] {新規人物( "ラリー"、18)、新たな人物( "デービッド"、30)、新たな人物( "ジェームズ"、20)、新たな人物(「ハリーを提供"18);}は、Arrays.sort(人、Comparator.comparingInt(人物:: getAge));いるassertTrue(をArrays.equals(人、新しい人[] {新規人物(" ラリー "18)、新たな人物("ハリー "18)、新しい人(" ジェームズ "20)、新しい人(" デビッド」、30)})); `` `##リストの並べ替えコレクションコレクションツールは、JDKソート方法をで使用することができ提供。Comparableを実装したクラスの `` `Javaの//Collections.sortソートリスト:Comparableを実装したクラスをソートするために 新しい人[] {新規人物( "ラリー"、18)、新たな人物( "ハリー"、18)、新たな人物( "ジェームズ"、20)、新たな人物( "デービッド"、30)})); `` ##リストの並べ替えコレクションJDKのコレクションのユーティリティクラスは、ソート方法を提供し、 `、あなたは簡単に使用することができます。Comparableを実装したクラスの `` `Javaの//Collections.sortソートリスト:Comparableを実装したクラスをソートするために 新しい人[] {新規人物( "ラリー"、18)、新たな人物( "ハリー"、18)、新たな人物( "ジェームズ"、20)、新たな人物( "デービッド"、30)})); `` ##リストの並べ替えコレクションJDKのコレクションのユーティリティクラスは、ソート方法を提供し、 `、あなたは簡単に使用することができます。Comparableを実装したクラスの `` `Javaの//Collections.sortソートリスト:Comparableを実装したクラスをソートするために 名前= asList( "ラリー"、 "ハリー"、 "ジェームズ"、 "デビッド"); Collections.sort(名);のassertEquals(名前、asList( "デビッド"、 "ハリー"、 "ジェームズ"、 "ラリー") ); `` `ソートコンパレータを提供しています` `` javaはリストをソートするコンパレータを提供//Collections.sort persons2 = asList(新人物( "ラリー"、18)、新しい人( "デビッド"、30)、新しい人( "ジェームズ"、20)、新しい人( "ハリー"、18)); Collections.sort(persons2 、Comparator.comparingInt(人:: getAge));のassertEquals(persons2、asList(新人物( "ラリー"、18)、新しい人( "ハリー"、18)、新しい人( "ジェームズ"、20)、新しい人(「デビッド」、30))); `` `逆順:ちょうどリストは、順番に、それはの順序に従ってしなければならないことを意味するものではありません:` `` Javaは、名前の順序を逆に//Collections.reverse = asList(「ラリー」 、 "ハリー"、 "ジェームズ"、 "デビッド"); Collections.reverse(名);のassertEquals(名前、asList( "デビッド"、 "ジェームズ"、 "ハリー"、 "ラリー")); `` ` - - ###リストソートリストメンバメソッド・インターフェースソート(コンパレータ c)の方法は、** **その配列に影響を与え、自分の並べ替えで実現することができます。`` `javaの//List.sortのソート名= asList( "ラリー"、 "ハリー"、 "ジェームズ"、」デビッド"); names.sort(Comparator.naturalOrder());のassertEquals(名前、asList("デビッド「」ハリー「」ジェームズ 「」ラリー「)); `` `##ストリームストリームは、(ソートされたソートを提供)と(コンパレータソート 返します新しいストリームをソートするコンパレータ)。`` `javaの//Stream.sortedソート名= asList( "ラリー"、 "ハリー"、 "ジェームズ"、 "デビッド");リスト 結果= names.stream().sorted().collect(Collectors.toList());のassertEquals(結果、asList( "デビッド"、 "ハリー"、 "ジェームズ"、 "ラリー")); //Stream.sorted提供コンパレータソート名= asList( "ラリー"、 "ハリー"、 "ジェームズ"、 "デビッド");結果= names.stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList()); assertEquals(その結果、asList(「デビッド」、「ハリー」、「ジェームズ」、「ラリー」)); `` `---#ソートソートの非常に単純なソートのような便利な単一のフィールドコンパレータ##単一のフィールドオブジェクト限り、フォームなど: - ** Comparator.comparing(クラス名::プロパティのゲッター)**ライン上のコンパレータ。あなたは逆にする必要がある場合は、あなたが必要とする: - ** Comparator.comparing(クラス名::プロパティのゲッター)(.reversed)** - **またはComparator.comparing(クラス名::プロパティのゲッター、Comparator.reverseOrder())** 。特定のコードの使用(リストの順序元の順序を破壊しないように、我々はストリームを操作しなければならない): `` `Javaの//ソート単一のフィールド - リストを昇順 personList = asList(新人物( "ラリー"、18)、新しい人( "デビッド"、30)、新しい人( "デビッド"、3)、新しい人( "ジェームズ"、20)、新しい人( "ハリー" 、18))。リスト personResult = personList.stream().sorted(Comparator.comparing(人物::のgetName)).collect(Collectors.toList())。assertEquals(personResult、asList(新人物( "デビッド"、30)、新しい人( "デビッド"、3)、新しい人( "ハリー"、18)、新しい人( "ジェームズ"、20)、新しい人(」ラリー」、18))); //单字段排序 - 倒序1 personResult = personList.stream().sorted(Comparator.comparing(人物::のgetName).reversed()).collect(Collectors.toList())。assertEquals(personResult、asList(新人物( "ラリー"、18)、新しい人( "ジェームズ"、20)、新しい人( "ハリー"、18)、新しい人( "デビッド"、30)、新しい人(」デビッド」、3))); //单字段排序 - 倒序2 personResult = personList.stream().sorted(Comparator.comparing(人物::のgetName、Comparator.reverseOrder())).collect(Collectors.toList())。assertEquals(personResult、ToListメソッド())。assertEquals(personResult、asList(新人物( "デビッド"、30)、新しい人( "デビッド"、3)、新しい人( "ハリー"、18)、新しい人( "ジェームズ"、20)、新しい人(」ラリー」、18))); //多字段排序-1倒2升personResult = personList.stream().sorted(Comparator.comparing(人物::のgetName、Comparator.reverseOrder()).thenComparing(人物:: getAge)).collect(Collectors.toList ())。assertEquals(personResult、asList(新人物( "ラリー"、18)、新しい人( "ジェームズ"、20)、新しい人( "ハリー"、18)、新しい人( "デビッド"、3)、新しい人(」デビッド」、30))); //多字段排序-1倒2倒personResult = personList.stream().sorted(Comparator.comparing(人物::のgetName、Comparator.reverseOrder()).thenComparing(人物:: getAge、Comparator.reverseOrder())) .collect(Collectors.toList())。assertEquals(personResult、asList(新人物( "ラリー"、18)、新しい人( "ジェームズ"、20)、新しい人( "ハリー"、18)、新しい人( "デビッド"、30)、新しい人( "デビッド"、3 ))); `#---この記事では、配列、リスト、でなければならないアプローチのストリームソートを説明するために比較トークから、およびコード例の形で関連をソートするために2つのインターフェイス(同等とコンパレータ)を要約します使用シナリオのJavaのソートのほとんどをカバーしています。そのようなセットや地図など他のコレクションのために、同じソート処理を行うことができ、彼らはその後、ソートされたストリームに変換することができます。

おすすめ

転載: www.cnblogs.com/larrydpk/p/11668113.html