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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3汉化版
中文版,非常好用

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具