如何在Scala中按两个字段对列表进行排序?

Twi*_*ton 89 sorting functional-programming scala

如何在Scala中按两个字段对列表进行排序,在本例中我将按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)
Run Code Online (Sandbox Code Playgroud)

我尝试这样的事情

rows.sortBy(_.lastName + _.firstName)
Run Code Online (Sandbox Code Playgroud)

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

sen*_*nia 201

rows.sortBy(r => (r.lastName, r.firstName))
Run Code Online (Sandbox Code Playgroud)

  • @SachinK:你必须为`Row`类创建自己的`Ordering`并将它与`sorted`方法一起使用,如下所示:`rows.sorted(customOrdering)`.你也可以使用`Tuple2`的自定义`Ordering`:`rows.sortBy(r =>(r.lastName,r.firstName))(Ordering.Tuple2(Ordering.String.reverse,Ordering.String))` . (12认同)
  • 如果我们想对lastName进行反向排序然后对firstName进行自然排序怎么办? (4认同)
  • @SachinK:您可以手动或使用`Ordering.by`实现`customOrdering`作为`Ordering [Row]`:`val customOrdering =`Ordering.by((r:Row)=>(r.lastName,r. firstName))(Ordering.Tuple2(Ordering.String.reverse,Ordering.String))` (4认同)
  • 优秀。或者按降序排序`rows.sortBy(r => (-r.field1, -r.field2))` (2认同)

use*_*own 11

rows.sortBy (row => row.lastName + row.firstName)
Run Code Online (Sandbox Code Playgroud)

如果要按合并的名称排序,如问题中所示,或者

rows.sortBy (row => (row.lastName, row.firstName))
Run Code Online (Sandbox Code Playgroud)

如果你想先按lastName排序,那么firstName; 与较长的名字相关(Wild,Wilder,Wilderman).

如果你写

rows.sortBy(_.lastName + _.firstName)
Run Code Online (Sandbox Code Playgroud)

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

<console>:14: error: wrong number of parameters; expected = 1
       rows.sortBy (_.lastName + _.firstName)
                               ^
Run Code Online (Sandbox Code Playgroud)


Mar*_*cin 6

通常,如果使用稳定的排序算法,则只需按一个键排序,然后按下一个键排序.

rows.sortBy(_.firstName).sortBy(_.lastName)
Run Code Online (Sandbox Code Playgroud)

最终结果将按姓氏排序,然后按名字排序.

  • 在sortBy方法的引擎下,Scala使用java.util.Arrays.sort,这对于对象数组保证稳定.所以,是的,这个解决方案是正确的.(这在Scala 2.10中检查过) (3认同)
  • @om-nom-nom:http://www.scala-lang.org/api/current/scala/util/Sorting$.html 快速排序仅针对值类型定义,所以是的。 (2认同)