"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment trier une liste d’objets en Java à l’aide de plusieurs champs ?

Comment trier une liste d’objets en Java à l’aide de plusieurs champs ?

Publié le 2024-11-07
Parcourir:708

 How to Sort a List of Objects in Java Using Multiple Fields?

Tri personnalisé des objets de liste avec plusieurs champs en Java

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.

Le problème

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.

Analyse

Votre code a effectivement un problème. Analysons le problème et identifions la bonne solution.

Code correct

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);

Solutions alternatives

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.

Conclusion

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.

Dernier tutoriel Plus>

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