복붙노트

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

이 같은 것들을 시도

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

그러나 그것은 작동하지 않습니다. 나는 좋은 쉬운 솔루션에 대한 호기심 그래서.

해결법

  1. ==============================

    1.

    rows.sortBy(r => (r.lastName, r.firstName))
    
  2. ==============================

    2.

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

    당신이 기준으로 정렬 할 경우 문제로, 이름을 합병, 또는

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

    처음과 lastName으로 정렬 할 경우, 다음 firstName을; 긴 이름에 대한 관련 (와일드, 와일더, Wilderman).

    당신이 작성하는 경우

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

    2 개 밑줄로,이 방법은 두 개의 파라미터를 기대 :

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

    3.일반적으로, 당신이 안정적인 정렬 알고리즘을 사용하는 경우, 당신이 할 수있는 그저 한 후, 키, 다음으로.

    일반적으로, 당신이 안정적인 정렬 알고리즘을 사용하는 경우, 당신이 할 수있는 그저 한 후, 키, 다음으로.

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

    최종 결과는 그 FIRSTNAME하여, 다음과 같다 여기서, LASTNAME으로 분류한다.

  4. ==============================

    4.아마도이 만 튜플의 목록을 위해 작동하지만

    아마도이 만 튜플의 목록을 위해 작동하지만

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

    작업에 나타나고 그것을 표현하는 간단한 방법이 될 수.

  5. from https://stackoverflow.com/questions/10027543/how-to-sort-a-list-in-scala-by-two-fields by cc-by-sa and MIT license