”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使用多个字段对 Java 中的对象列表进行排序?

如何使用多个字段对 Java 中的对象列表进行排序?

发布于2024-11-07
浏览:356

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

Java 中具有多个字段的列表对象的自定义排序

虽然基于一个字段对列表中的对象进行排序很简单,但使用多个字段进行排序可能有点棘手。本文深入研究按多个字段排序的问题,并探讨 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