106

如何按两个字段对 Scala 中的列表进行排序,在本例中,我将按姓氏和名字排序?

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)

但它不起作用。所以我很好奇一个好的和简单的解决方案。

4

4 回答 4

232
rows.sortBy(r => (r.lastName, r.firstName))
于 2012-04-05T11:25:09.890 回答
14
rows.sortBy (row => row.lastName + row.firstName)

如果您想按合并名称排序,如您的问题,或者

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

如果您首先要按姓氏排序,则按名字排序;与较长的名称相关(Wild、Wilder、Wilderman)。

如果你写

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

带有 2 个下划线,该方法需要两个参数:

<console>:14: error: wrong number of parameters; expected = 1
       rows.sortBy (_.lastName + _.firstName)
                               ^
于 2012-04-05T11:20:19.160 回答
8

一般来说,如果你使用稳定的排序算法,你可以只按一个键排序,然后按下一个键排序。

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

最终结果将按姓氏排序,然后在相等的地方按名字排序。

于 2012-04-05T11:21:15.167 回答
-3

也许这仅适用于元组列表,但是

scala> var zz = List((1, 0.1), (2, 0.5), (3, 0.6), (4, 0.3), (5, 0.1))
zz: List[(Int, Double)] = List((1,0.1), (2,0.5), (3,0.6), (4,0.3), (5,0.1))

scala> zz.sortBy( x => (-x._2, x._1))
res54: List[(Int, Double)] = List((3,0.6), (2,0.5), (4,0.3), (1,0.1), (5,0.1))

似乎有效,并且是一种简单的表达方式。

于 2014-10-06T14:35:54.350 回答