Si bien ordenar objetos en una lista según un campo es sencillo, ordenar usando múltiples campos puede ser un poco complicado . Este artículo profundiza en el tema de la clasificación por múltiples campos y explora las diversas soluciones disponibles en Java.
Considere un escenario en el que tiene una lista de objetos "Informe" con tres campos : Clave de informe, Número de estudiante y Escuela. Desea ordenar esta lista usando los tres campos en un orden específico.
El fragmento de código que proporcionó intenta ordenar la lista usando Collections.sort con un Comparador personalizado, pero por alguna razón, la clasificación no funciona como se esperaba. Sospechas que puede haber un problema con el código.
De hecho, tu código tiene un problema. Analicemos el problema e identifiquemos la solución correcta.
El problema en el código proporcionado radica en la concatenación de los tres campos:
return (record1.getReportKey() record1.getStudentNumber() record1.getSchool()).compareTo(record2.getReportKey() record2.getStudentNumber() record2.getSchool());
Esta concatenación supone que los campos son de escriba Cadena. Sin embargo, en su caso, los tres campos están definidos como tipos de cadena, por lo que la concatenación simplemente daría como resultado una comparación de cadenas. Probablemente esto no sea lo que pretendía.
Para comparar correctamente los campos, debe compararlos individualmente y en el orden correcto:
return Comparator.comparing(Report::getReportKey)
.thenComparing(Report::getStudentNumber)
.thenComparing(Report::getSchool)
.compare(record1, record2);
Además del código corregido, aquí hay soluciones alternativas para ordenar por múltiples campos en Java:
Opción 1: Clasificación reflexiva usando BeanComparator
BeanComparator se puede utilizar para ordenar objetos según los captadores. Sin embargo, es propenso a errores y menos eficiente debido al uso de reflexión.
Opción 2: Google Guava ComparisonChain
Google Guava proporciona una manera conveniente de encadenar múltiples comparaciones. También maneja valores nulos con elegancia.
Opción 3: Apache Commons CompareToBuilder
Esta clase de biblioteca es similar a ComparisonChain de Guava pero tiene un comportamiento predeterminado ligeramente diferente para valores nulos.
La solución correcta para su problema es utilizar el código revisado con comparaciones de campos individuales. Alternativamente, puede elegir una de las otras opciones analizadas anteriormente según sus requisitos específicos. Comprender los principios de clasificación por múltiples campos y las diferencias entre las herramientas disponibles le permitirá manejar eficazmente escenarios de clasificación complejos en sus aplicaciones Java.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3