在Kotlin中按多个字段对集合进行排序

时间:2016-05-16 16:51:37

标签: kotlin

让我们说我有一个人员列表,我需要先按年龄排序,然后按姓名排序。

来自C#-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实现这一目标?

这就是我所尝试的(它显然是错误的,因为第一个&#34; sortedBy&#34;子句的输出被第二个子句覆盖,导致列表仅按名称排序)

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

2 个答案:

答案 0 :(得分:269)

sortedWith + compareBy(取一群lambdas)诀窍:

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

您还可以使用更简洁的可调用引用语法:

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

答案 1 :(得分:82)

使用sortedWith对列表Comparator进行排序。

然后,您可以使用以下几种方法构建比较器:

  • compareBythenBy在一系列调用中构建比较器:

    list.sortedWith(compareBy<Person> { it.age }.thenBy { it.name }.thenBy { it.address })
    
  • compareBy有一个带有多个函数的重载:

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