332 votes

Trier la collection de champs multiples dans Kotlin

Disons que j'ai une liste de Gens à qui j'ai besoin de trier par Âge à la première, puis par Nom.

Venant d'un C#-fond, je peux facilement réaliser cela dans cette langue par l'utilisation de LINQ:

var list=new List<Person>();
list.Add(new Person(25, "Tom"));
list.Add(new Person(25, "Dave"));
list.Add(new Person(20, "Kate"));
list.Add(new Person(20, "Alice"));

//will produce: Alice, Kate, Dave, Tom
var sortedList=list.OrderBy(person => person.Age).ThenBy(person => person.Name).ToList(); 

Comment accomplir cela en utilisant Kotlin?

C'est ce que j'ai essayé (c'est évidemment faux puisque la sortie de la première "sortedBy" clause obtient remplacé par le second qui résultats dans une liste triée par Nom seulement)

val sortedList = ArrayList(list.sortedBy { it.age }.sortedBy { it.name })) //wrong

568voto

Alexander Udalov Points 76

``+ `` (prenant un vararg des lambdas) l’astuce :

Vous pouvez également utiliser la syntaxe de référence pouvant être appelé par un peu plus concise :

184voto

hotkey Points 119

Utiliser sortedWith pour trier une liste avec Comparator.

Vous pouvez ensuite construire un comparateur à l'aide de plusieurs façons:

  • compareBy, thenBy construire le comparateur dans une chaîne d'appels:

    list.sortedWith(compareBy<Person> { it.age }.thenBy { it.name }.thenBy { it.address })
    
  • compareBy a une surcharge qui prend de multiples fonctions:

    list.sortedWith(compareBy({ it.age }, { it.name }, { it.address }))
    

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X