web-dev-qa-db-ja.com

Scalaのリストを2つのフィールドでソートするには?

Scalaのリストを2つのフィールドでソートする方法。この例では、lastNameとfirstNameでソートしますか?

case class Row(var firstName: String, var lastName: String, var city: String)

var rows = List(new Row("Oscar", "Wilde", "London"),
                new Row("Otto",  "Swift", "Berlin"),
                new Row("Carl",  "Swift", "Paris"),
                new Row("Hans",  "Swift", "Dublin"),
                new Row("Hugo",  "Swift", "Sligo"))

rows.sortBy(_.lastName)

私はこのようなことを試みます

rows.sortBy(_.lastName + _.firstName)

しかし、それは機能しません。だから私は良い簡単な解決策に興味があります。

88
Twistleton
rows.sortBy(r => (r.lastName, r.firstName))
198
senia
rows.sortBy (row => row.lastName + row.firstName)

質問のように、結合された名前でソートする場合、または

rows.sortBy (row => (row.lastName, row.firstName))

最初にlastNameでソートしたい場合は、firstName;長い名前(Wild、Wilder、Wilderman)に関連します。

書くなら

rows.sortBy(_.lastName + _.firstName)

下線が2つある場合、メソッドは2つのパラメーターを予期します。

<console>:14: error: wrong number of parameters; expected = 1
       rows.sortBy (_.lastName + _.firstName)
                               ^
11
user unknown

一般に、安定したソートアルゴリズムを使用する場合、1つのキーでソートしてから、次のキーでソートできます。

rows.sortBy(_.firstName).sortBy(_.lastName)

最終結果は姓でソートされ、次に等しい場合は名でソートされます。

6
Marcin