Bien que le tri des objets dans une liste en fonction d'un seul champ soit simple, le tri à l'aide de plusieurs champs peut être un peu délicat . Cet article aborde la question du tri par plusieurs champs et explore les différentes solutions disponibles en Java.
Considérez un scénario dans lequel vous disposez d'une liste d'objets « Rapport » avec trois champs. : ReportKey, StudentNumber et School. Vous souhaitez trier cette liste en utilisant les trois champs dans un ordre spécifique.
L'extrait de code que vous avez fourni tente de trier la liste à l'aide de Collections.sort avec un comparateur personnalisé, mais pour une raison quelconque, le tri ne fonctionne pas. comme prévu. Vous pensez qu'il peut y avoir un problème avec le code.
Votre code a effectivement un problème. Analysons le problème et identifions la bonne solution.
Le problème dans le code fourni réside dans la concaténation des trois champs :
return (record1.getReportKey() record1.getStudentNumber() record1.getSchool()).compareTo(record2.getReportKey() record2.getStudentNumber() record2.getSchool());
Cette concaténation suppose que les champs sont de tapez Chaîne. Cependant, dans votre cas, les trois champs sont définis comme des types String, donc la concaténation entraînerait simplement une comparaison de chaînes. Ce n'est probablement pas ce que vous vouliez.
Pour comparer correctement les champs, vous devez les comparer individuellement et dans le bon ordre :
return Comparator.comparing(Report::getReportKey)
.thenComparing(Report::getStudentNumber)
.thenComparing(Report::getSchool)
.compare(record1, record2);
En plus du code corrigé, voici des solutions alternatives pour trier par plusieurs champs en Java :
Option 1 : tri réfléchi à l'aide de BeanComparator
BeanComparator peut être utilisé pour trier des objets en fonction des getters. Cependant, il est sujet aux erreurs et moins efficace en raison de l'utilisation de la réflexion.
Option 2 : Google Guava ComparisonChain
Google Guava offre un moyen pratique d'enchaîner plusieurs comparaisons. Il gère également les valeurs nulles avec élégance.
Option 3 : Apache Commons CompareToBuilder
Cette classe de bibliothèque est similaire à ComparisonChain de Guava mais a un comportement par défaut légèrement différent pour les valeurs nulles.
La bonne solution à votre problème consiste à utiliser le code révisé avec des comparaisons de champs individuels. Vous pouvez également choisir l’une des autres options décrites ci-dessus en fonction de vos besoins spécifiques. Comprendre les principes du tri par plusieurs champs et les différences entre les outils disponibles vous permettra de gérer efficacement des scénarios de tri complexes dans vos applications Java.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3