首頁  >  文章  >  Java  >  如何使用多個欄位對 Java 中的物件清單進行排序?

如何使用多個欄位對 Java 中的物件清單進行排序?

DDD
DDD原創
2024-10-28 14:17:02228瀏覽

 How to Sort a List of Objects in Java Using Multiple Fields?

Java 中具有多個字段的列表對象的自定義排序

雖然基於一個字段對列表中的對象進行排序很簡單,但使用多個字段進行排序可能有點棘手。本文深入研究了按多個欄位排序的問題,並探討了 Java 中可用的各種解決方案。

問題

考慮一個場景,其中您有一個包含三個欄位的「Report」物件清單:ReportKey、StudentNumber 和 School。您希望按特定順序使用所有三個欄位對此清單進行排序。

您提供的程式碼片段嘗試使用 Collections.sort 和自訂比較器對清單進行排序,但由於某種原因,排序不起作用如預期的那樣。您懷疑代碼可能有問題。

分析

您的程式碼確實有問題。讓我們分析問題並確定正確的解決方案。

正確程式碼

提供的程式碼中的問題在於三個欄位的串連:

<code class="java">return (record1.getReportKey() + record1.getStudentNumber() + record1.getSchool()).compareTo(record2.getReportKey() + record2.getStudentNumber() + record2.getSchool());</code>

此串連假設欄位的類型為 String。但是,在您的情況下,所有三個欄位都定義為 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn