Bien que trier les objets d'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 champs multiples 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 :
<code class="java">return (record1.getReportKey() + record1.getStudentNumber() + record1.getSchool()).compareTo(record2.getReportKey() + record2.getStudentNumber() + record2.getSchool());</code>
Cette concaténation suppose que les champs sont de type String. 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 :
<code class="java">return Comparator.comparing(Report::getReportKey) .thenComparing(Report::getStudentNumber) .thenComparing(Report::getSchool) .compare(record1, record2);</code>
Dans 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 basé sur 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 est d'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 champs multiples et les différences entre les outils disponibles vous permettra de gérer efficacement des scénarios de tri complexes dans vos applications Java.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!