雖然基於一個字段對列表中的對象進行排序很簡單,但使用多個字段進行排序可能有點棘手。本文深入研究按多個欄位排序的問題,並探討 Java 中可用的各種解決方案。
考慮一個場景,其中您有一個包含三個欄位的「Report」物件清單:ReportKey、學號和學校。您希望按特定順序使用所有三個欄位對此清單進行排序。
您提供的程式碼片段嘗試使用 Collections.sort 和自訂比較器對清單進行排序,但由於某種原因,排序不起作用正如預期的那樣。您懷疑代碼可能有問題。
您的程式碼確實有問題。讓我們分析問題並確定正確的解決方案。
提供的程式碼中的問題在於三個欄位的串連:
return (record1.getReportKey() record1.getStudentNumber() record1.getSchool()).compareTo(record2.getReportKey() record2.getStudentNumber() record2.getSchool());
此串聯假設欄位為類型字串。但是,在您的情況下,所有三個欄位都定義為 String 類型,因此連線只會導致字串比較。這可能不是您想要的。
要正確比較字段,您需要按正確的順序單獨比較它們:
return Comparator.comparing(Report::getReportKey)
.thenComparing(Report::getStudentNumber)
.thenComparing(Report::getSchool)
.compare(record1, record2);
除了更正的程式碼之外,這裡還有Java中按多個欄位排序的替代解決方案:
選項1:使用BeanComparator 進行反射排序
BeanComparator 可用來依據getter 對物件進行排序。然而,由於反射的使用,它很容易出錯並且效率較低。
選項2:Google Guava ComparisonChain
Google Guava 提供了一種方便的方法來連結多個比較。它還可以優雅地處理空值。
選項 3:Apache Commons CompareToBuilder
這個庫類別與 Guava 的 ComparisonChain 類似,但對於空值的預設行為略有不同。
您的問題的正確解決方案是使用修訂後的代碼進行各個字段比較。或者,您可以根據您的特定要求選擇上面討論的其他選項之一。了解多字段排序的原理以及可用工具之間的差異將使您能夠有效地處理 Java 應用程式中的複雜排序場景。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3