web-dev-qa-db-fra.com

Trier la collection par plusieurs champs dans Kotlin

Disons que j'ai une liste de personnes que je dois trier par âge en premier, puis par nom.

Venant d’un fond C #, je peux facilement y parvenir dans LINQ en utilisant ce langage:

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 peut-on accomplir cela en utilisant Kotlin?

C’est ce que j’ai essayé (c’est évidemment faux puisque la sortie de la première clause "sortis par" est remplacée par la seconde, ce qui donne une liste triée par nom uniquement)

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

sortedWith + compareBy (en prenant un vararg de lambdas) faites le tour:

val sortedList = list.sortedWith(compareBy({ it.age }, { it.name }))

Vous pouvez également utiliser la syntaxe de référence appelable un peu plus succincte:

val sortedList = list.sortedWith(compareBy(Person::age, Person::name))
294
Alexander Udalov

Utilisez sortedWith pour trier une liste avec Comparator.

Vous pouvez ensuite construire un comparateur de plusieurs manières:

  • compareBy , thenBy construit 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 plusieurs fonctions:

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