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

Fir*_*095 187 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(); 
Run Code Online (Sandbox Code Playgroud)

如何使用Kotlin实现这一目标?

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

val sortedList = ArrayList(list.sortedBy { it.age }.sortedBy { it.name })) //wrong
Run Code Online (Sandbox Code Playgroud)

Ale*_*lov 321

sortedWith+ compareBy(采取一系列lambda)做法:

val sortedList = list.sortedWith(compareBy({ it.age }, { it.name }))
Run Code Online (Sandbox Code Playgroud)

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

val sortedList = list.sortedWith(compareBy(Person::age, Person::name))
Run Code Online (Sandbox Code Playgroud)

  • `compareByDescending`将反转所有功能.如果你只想用一个字段降序,在前面敲一个`-`(减号),就像这样`{-it.age}` (11认同)
  • 这是按升序排序,如何按降序排序? (2认同)
  • @Chandrika`compareByDescending` (2认同)

hot*_*key 99

使用sortedWith排序与列表Comparator.

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

  • @Aneem,Kotlin 编译器有时无法推断类型参数,需要手动指定。一种这样的情况是当需要泛型类型,并且您想要传递泛型函数调用链的结果时,例如 `compareBy&lt;Person&gt; { it.age }.thenBy { it.name }.thenBy { it.address }` . 在第二点中,只有一个函数调用,没有调用链:`compareBy({ it.age }, { it.name }, { it.address })`。 (2认同)
  • 如何添加Case Insensitive? (2认同)