1 つのフィールドに基づいてリスト内のオブジェクトを並べ替えるのは簡単ですが、複数のフィールドを使用して並べ替えるのは少し難しい場合があります。この記事では、複数のフィールドによる並べ替えの問題を詳しく掘り下げ、Java で利用できるさまざまな解決策を検討します。
3 つのフィールドを持つ「レポート」オブジェクトのリストがあるシナリオを考えてみましょう。 : ReportKey、StudentNumber、および School。 3 つのフィールドすべてを使用してこのリストを特定の順序で並べ替えたいと考えています。
指定したコード スニペットは、カスタム コンパレーターを使用して Collections.sort を使用してリストを並べ替えようとしていますが、何らかの理由で並べ替えが機能しません。予想通り。コードに問題がある可能性があると思われます。
実際にコードに問題があります。問題を分析して、正しい解決策を特定しましょう。
提供されたコードの問題は、次の 3 つのフィールドの連結にあります。
<code class="java">return (record1.getReportKey() + record1.getStudentNumber() + record1.getSchool()).compareTo(record2.getReportKey() + record2.getStudentNumber() + record2.getSchool());</code>
この連結フィールドの型が String であることを前提としています。ただし、あなたの場合、3 つのフィールドはすべて String 型として定義されているため、連結の結果は単に文字列の比較になります。これは意図したものではない可能性があります。
フィールドを正しく比較するには、フィールドを個別に正しい順序で比較する必要があります。
<code class="java">return Comparator.comparing(Report::getReportKey) .thenComparing(Report::getStudentNumber) .thenComparing(Report::getSchool) .compare(record1, record2);</code>
修正されたコードに加えて、Java の複数のフィールドによるソートの代替ソリューションを以下に示します。
オプション 1: BeanComparator を使用したリフレクティブ ソート
BeanComparator を使用してオブジェクトをソートできます。ゲッターに基づいています。ただし、リフレクションを使用するため、エラーが発生しやすく、効率も低下します。
オプション 2: Google Guava ComparisonChain
Google Guava は、複数の比較を連鎖する便利な方法を提供します。また、null 値も適切に処理されます。
オプション 3: Apache Commons CompareToBuilder
このライブラリ クラスは Guava の ComparisonChain に似ていますが、null 値に対するデフォルトの動作が若干異なります。
問題の正しい解決策は、修正されたコードを個々のフィールド比較で使用することです。あるいは、特定の要件に基づいて、上で説明した他のオプションのいずれかを選択することもできます。複数のフィールドによる並べ替えの原則と、使用可能なツール間の違いを理解すると、Java アプリケーションで複雑な並べ替えシナリオを効果的に処理できるようになります。
以上が複数のフィールドを使用してJavaでオブジェクトのリストを並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。