Maison  >  Article  >  Java  >  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 ?

DDD
DDDoriginal
2024-10-28 14:17:02228parcourir

 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 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.

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 :

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

Solutions alternatives

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.

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn