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

Java在不同操作系统上的表现存在细微差异。1)JVM实现不同,如HotSpot、OpenJDK,影响性能和垃圾回收。2)文件系统结构和路径分隔符不同,需使用Java标准库处理。3)网络协议实现差异影响网络性能。4)GUI组件外观和行为在不同系统上有别。通过使用标准库和虚拟机测试,可减少这些差异的影响,确保Java程序稳定运行。

javaoffersrobustobject-IentiendedProgrammming(OOP)和Top-Notchsecurityfeatures.1)OopinjavainCludesClasses,对象,继承,多态性,和列出,andeclingfleximaintainablesys.ss.2)SecurityFeateTuersLudEtersludEterMachine(

JavaScriptandJavahavedistinctstrengths:JavaScriptexcelsindynamictypingandasynchronousprogramming,whileJavaisrobustwithstrongOOPandtyping.1)JavaScript'sdynamicnatureallowsforrapiddevelopmentandprototyping,withasync/awaitfornon-blockingI/O.2)Java'sOOPf

JAVAACHIEVESPLATFORMINDEPENTENCETHROUGHJAVAVIRTAILMACHINE(JVM)和BYTECODE.1)THEJVMINTERPRETSBBYTECODE,允许theingthesmecodetorunonanyanyanyanyplatformwithajvm.2)

Java'splatFormIndependecemeanSapplicationsCanrunonAnyPlatFormWithAjvm,使“ Writeonce,RunanyWhere”。

JVM'SperformanceIsCompetitiveWithOtherRuntimes,operingabalanceOfspeed,安全性和生产性。1)JVMUSESJITCOMPILATIONFORDYNAMICOPTIMIZAIZATIONS.2)c提供NativePernativePerformanceButlanceButlactsjvm'ssafetyFeatures.3)

JavaachievesPlatFormIndependencEthroughTheJavavIrtualMachine(JVM),允许CodeTorunonAnyPlatFormWithAjvm.1)codeisscompiledIntobytecode,notmachine-specificodificcode.2)bytecodeisisteredbytheybytheybytheybythejvm,enablingcross-platerssectectectectectross-eenablingcrossectectectectectection.2)

TheJVMisanabstractcomputingmachinecrucialforrunningJavaprogramsduetoitsplatform-independentarchitecture.Itincludes:1)ClassLoaderforloadingclasses,2)RuntimeDataAreafordatastorage,3)ExecutionEnginewithInterpreter,JITCompiler,andGarbageCollectorforbytec


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

禅工作室 13.0.1
功能强大的PHP集成开发环境

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