2016-05-16 16 views
65

私は年齢順、次に名前順に並べ替える必要がある人のリストを持っているとしましょう。コトリンの複数のフィールドでコレクションを並べ替え

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を使用して、これを達成ん:?C#の-backgroundから来る

、私は簡単にこれでは、LINQを使用して、言語を言っ達成することができますか

これは私が試したものです(最初の「sortedBy」句の出力のみ名によってソートされたリストになり秒1で上書きされますので、それは明らかに間違っている)

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

答えて

110

sortedWith + compareBy(ラムダの可変引数を取る)トリックを行う:

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

あなたはまた、いくぶんより簡潔呼び出し可能な参照構文を使用することができます。

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

コトリンは神様です – ElliotM

38

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 })) 
    
+0

ありがとう、これは私が探していたものです!私はkotlinに少し新しく、最初の箇条書きの点で 'compareBy'だけではなく、なぜcompareBy を持っている必要がありますか? – Aneem

+0

@Aneem、Kotlinコンパイラは型引数を推論することができない場合があり、それを手動で指定する必要があります。このようなケースの1つは、ジェネリック型が予想され、 'compareBy {it.age} .thenBy {it.name} .thenBy {it.address}'のような汎用関数呼び出しチェーンの結果を渡す場合です。 2番目のポイントには、関数呼び出しが1つしかなく、コールチェーンはありません: 'compareBy({it.age}、{it.name}、{it.address})'。 – hotkey

関連する問題