2013-11-15 2 views
3

나는 경우이 작업을 수행하는 이유스칼라 정렬 옵션

case class Foo(bar: Option[String]) 

같은 경우 클래스

scala> val l = List(Foo(Some("b")), Foo(Some("a")), Foo(Some("c"))) 
l: List[Foo] = List(Foo(Some(b)), Foo(Some(a)), Foo(Some(c))) 
scala> l.sortBy(_.bar) 
res1: List[Foo] = List(Foo(Some(a)), Foo(Some(b)), Foo(Some(c))) 

하지만이

scala> l.sortWith((x,y) => x.bar > y.bar) 
<console>:11: error: value > is not a member of Option[String] 
      l.sortWith((x,y) => x.bar > y.bar) 

나는의 List를 정렬하려면 Option[String]을 내림차순으로 사용하면 sortBy을 사용하고을 사용하는 것이 더 간단합니다.목록에?

답변

8

sorted은 아니지만 sortWith은 암시 적 매개 변수 Ordering을 사용하고 Ordering은 옵션을 알고 있기 때문입니다. sortWith을 사용하면 스스로 해결할 수 있습니다. 그리고 <을 사용하면 스스로 해결할 수 있습니다.

l.sortWith((a,b) => Ordering[Option[String]].gt(a.bar,b.bar)) 

또는 가져 오기로 더 좋은 버전을 (그러나 지금은 그 내용에 따라 어디 Option의 비교 할 수 있습니다; 희망이 :

당신은 투박한 방식으로 같은 기계에 액세스 할 수 있습니다) 당신이 원하는 무엇인가 :

import scala.math.Ordered._ 
l.sortWith((a,b) => a.bar > b.bar) 

첫 번째는 당신이 정말로 성능을 누르면하지 않는 한, 그냥 .sorted.reverse.에 쉽게되도록 입이다. 예를 들어 a.bar.isEmpty || !b.bar.isEmpty || a.bar.get < b.bar.get과 같이 옵션 로직을 수동으로 처리하는 것이 좋습니다.

여러 가지 작업을 수행하려는 경우 명확하게하기 위해 두 번째 작업을 수행하기가 어렵습니다. 단 하나의 시험을 위해, 나는 여전히 .sorted.reverse을 선호 할 것입니다.

+2

'import math.Ordered._'를 사용하여 답안 솔루션에 추가 할 수 있습니다. 이 경우'l.sortWith ((x, y) => x.bar> y.bar)'는 예상대로 작동합니다. – senia

+0

@senia - 실제로 이것은 좋은 생각입니다. 왜 내가 수동으로 해보고 싶다고 생각하는지 모르겠다. 여분의 수입에 대한 반사적 인 혐오감, 아마도? –