1. ホーム
  2. コトリン

[解決済み】Kotlinでコレクションを複数フィールドでソートする【重複あり

2022-03-26 13:38:08

質問

例えば、「人」のリストがあり、まず年齢でソートし、次に名前でソートする必要があるとします。

C#のバックグラウンドを持っている私は、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" 節の出力は、2番目の節によって上書きされ、名前だけでソートされたリストになってしまうので、明らかに間違っていると思います)。

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

解決方法は?

sortedWith + compareBy (ラムダのvarargを取る)がトリックです。

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

また、より簡潔な callable reference 構文も使用できます。

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