나는 이름 목록이 있다고 가정 해 봅시다.스칼라에서 Seq.sortBy 확장하기
case class Name(val first: String, val last: String)
val names = Name("c", "B") :: Name("b", "a") :: Name("a", "B") :: Nil
이제 성을 기준으로 목록을 정렬하려는 경우 (그리고 이름이 충분하지 않은 경우 이름으로) 쉽게 정렬 할 수 있습니다.
names.sortBy(n => (n.last, n.first))
// List[Name] = List(Name(a,B), Name(c,B), Name(b,a))
그러나 문자열의 다른 데이터 정렬을 기반으로이 목록을 정렬하려면 어떻게해야합니까?
불행하게도, 다음은 작동하지 않습니다
val o = new Ordering[String]{ def compare(x: String, y: String) = collator.compare(x, y) }
names.sortBy(n => (n.last, n.first))(o)
// error: type mismatch;
// found : java.lang.Object with Ordering[String]
// required: Ordering[(String, String)]
// names.sortBy(n => (n.last, n.first))(o)
날 여러 함께 if
명시 적 sortWith
방법을 작성하지 않고도 순서를 변경할 수있는 방법이 - 모든 처리하기 위해 else
가지 케이스?
음, 잘 모르겠습니다. 3^k로 곱하면 똑똑해 보이지만 -1/0/+ 1 규칙을 따르지 않으면 무언가가 당연히 작동하지 않습니다. 또한, 차이점이 발견되면 Tuple 비교가 중지되는 반면, 모든 비교를 즉시 평가합니다. – Debilski
@Debilski - Whoops,'math.signum' 래퍼를 잊어 버렸습니다! 그리고 예, 그것은 완전한 평가를합니다. 속도에는 이상적이지 않습니다. 그렇습니다. –
'collator'는'java.text.Collator'의 인스턴스라고 가정했습니다. –