在Kotlin中按多个字段排序收集

比方说,我有一个人名列表,我需要首先按年龄,然后按名称排序。

来自C#的背景,我可以通过使用LINQ轻松实现这种语言:

var list=new List(); 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”子句的输出被第二个输出覆盖,导致列表按Name排序)

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

2 Solutions collect form web for “在Kotlin中按多个字段排序收集”

sortedWith + compareBy (采用可变compareBy的lambdaexpression式)诀窍:

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

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

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

使用sortedWithComparator sortedWith进行排序。

然后你可以用几种方法构造一个比较器:

  • compareBythenBy在调用链中构造比较器:

     list.sortedWith(compareBy { it.age }.thenBy { it.name }.thenBy { it.address }) 
  • compareBy有一个重载函数,它有多个函数:

     list.sortedWith(compareBy({ it.age }, { it.name }, { it.address })) 
  • 是否可以在Kotlin的列表中传播一个列表?
  • 没有getter的Kotlin构造函数参数
  • 使用Kotlin中的动态字段解析json对象
  • Kotlin中的密封类,不兼容的types错误
  • 在Kotlin中枚举注释
  • 记录Kotlin中函数参数的参数
  • 函数参数和对象的Kotlinunit testing
  • 为什么Kotlin不需要明确地尝试和捕捉
  • 在Kotlin创建文件ZIP
  • 移除Firebase侦听器不适用于Android
  • Kotlin负模块返回负值
  • Kotlin language will be the best programming language for Android.