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