Сортировка коллекции по нескольким полям в Котлине
Скажем, у меня есть список людей, которые мне нужно отсортировать по возрасту сначала, а затем по имени.
Исходя из С# -background, я легко могу достичь этого на указанном языке, используя 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();
Как это сделать с помощью Kotlin?
Это то, что я пробовал (это явно неправильно, так как вывод первого предложения sortedBy становится переопределенным вторым, что приводит к списку, отсортированному только по имени)
val sortedList = ArrayList(list.sortedBy { it.age }.sortedBy { it.name })) //wrong
Ответы
Ответ 1
sortedWith
+ compareBy
(с помощью vararg lambdas) делают трюк:
val sortedList = list.sortedWith(compareBy({ it.age }, { it.name }))
Вы также можете использовать несколько более сжатый ссылочный синтаксис:
val sortedList = list.sortedWith(compareBy(Person::age, Person::name))
Ответ 2
Используйте sortedWith
чтобы отсортировать список с помощью Comparator
.
Затем вы можете построить компаратор несколькими способами:
-
compareBy
, а thenBy
построить компаратор в цепочке вызовов:
list.sortedWith(compareBy<Person> { it.age }.thenBy { it.name }.thenBy { it.address })
-
compareBy
есть перегрузка, которая принимает несколько функций:
list.sortedWith(compareBy({ it.age }, { it.name }, { it.address }))