How to sort a list in Scala by two fields?

前端 未结 4 1316
执念已碎
执念已碎 2020-12-02 07:09

how to sort a list in Scala by two fields, in this example I will sort by lastName and firstName?

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


        
相关标签:
4条回答
  • 2020-12-02 07:49

    In general, if you use a stable sorting algorithm, you can just sort by one key, then the next.

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

    The final result will be sorted by lastname, then where that is equal, by firstname.

    0 讨论(0)
  • 2020-12-02 07:57
    rows.sortBy (row => row.lastName + row.firstName)
    

    If you want to sort by the merged names, as in your question, or

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

    if you first want to sort by lastName, then firstName; relevant for longer names (Wild, Wilder, Wilderman).

    If you write

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

    with 2 underlines, the method expects two parameters:

    <console>:14: error: wrong number of parameters; expected = 1
           rows.sortBy (_.lastName + _.firstName)
                                   ^
    
    0 讨论(0)
  • 2020-12-02 07:57

    Perhaps this works only for a List of Tuples, but

    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))
    

    appears to work and be a simple way to express it.

    0 讨论(0)
  • 2020-12-02 08:15
    rows.sortBy(r => (r.lastName, r.firstName))
    
    0 讨论(0)
提交回复
热议问题