2012-11-03 4 views
2

가끔 주문이없는 클래스에 대해 매우 간단한 Ordering [A]을 원한다는 것을 발견했습니다. 일반적으로 튜플 또는 클래스의 필드 투영. 다음 클래스는 일반적으로 이것을 수행하는 것 같습니다.파생 주문은 스칼라입니까?

case object Ord { 
    case class DerivedOrdering[A,B](fn : B=>A)(implicit o : Ordering[A]) extends Ordering[B] { 
     def compare(a:B, b:B) = o.compare(fn(a), fn(b)) 
    } 
} 

scala 라이브러리에서 본 적이 없습니다. 그것은 어딘가에 있습니까?

사용은

Ord.DerivedOrdering[Int, (Int, List[Int])](_._1) 

정수로 (INT, 목록 [지능]) 순서에 순서를 제공합니다.

답변

6

뭔가가 당신이 할 수있다 표준 라이브러리의 메소드입니다.

def by[T, S](f: T => S)(implicit ord: Ordering[S]): Ordering[T] 

예를 들어 다음과 같은 작업을 수행 할 수 있습니다

implicit val tupleOrdering = Ordering.by[(Int, List[Int]), Int] { 
    _._1 
} 

르우벤

+0

예쁜합니다. 나는 그 존재를 전혀 몰랐다. –

0

본인이 아니지만 통화 사이트에서 할 수 있습니다. 대신 당신이 설명하는 순서와

foo.sorted() 

말, 당신은 어떤 투사 또는 당신이 원하는 더 복잡한 표정으로

foo.sortBy(_._1) 

을 말할 수있는 예를 들어

foo.sortBy(_._1.toLowercase) 
관련 문제