2014-09-24 2 views
2

두 개의 Seq[M]과 두 개의 시퀀스에 대해 함수와 같은 비교기를 작성하는 방법은? compare(m1:M, m2:M):Int과 같은 비교기가 있습니까?시퀀스 용 함수와 같은 스칼라 비교 자

def compare[M](s1:Seq[M], s2:Seq[M], cmp:(M,M)=>Int) : Int = { 
    ??? 
} 

이 시퀀스를 반복하여 구현하는 데 아무런 문제가 없지만 이미 스칼라 라이브러리에 준비가되어 있습니다. Ordering 클래스와 개체를 살펴 보았지만 모든 암시 적 트리에 대한 포리스트를 보는 데 문제가 있습니다.

편집 : 코드를 복사 이외의 https://github.com/scala/scala/blob/v2.11.2/src/library/scala/math/Ordering.scala#L1에서 볼 수있는 seqDerivedOrdering을 사용하는 방법은?

답변

3

seqDerivedOrdering을 사용할 수 있지만 여전히 (M,M) => Int이 아니므로 암시 적으로 정렬해야합니다. 우리는 더 나은 수행 할 수

def compare[M](s1: Seq[M], s2: Seq[M])(cmp: (M, M) => Int): Int = { 

    import scala.math.Ordering.Implicits._ 

    implicit val orderM = new Ordering[M] { 
     override def compare(x: M, y: M): Int = cmp(x, y) 
    } 

    implicitly[Ordering[Seq[M]]].compare(s1, s2) 
    } 

또는 :

import scala.math.Ordering.Implicits._ 

    def compare[M](s1: Seq[M], s2: Seq[M])(cmp: (M, M) => Int)(implicit ord: Ordering[Seq[M]]): Int = { 

    implicit val orderM = new Ordering[M] { 
     override def compare(x: M, y: M): Int = cmp(x, y) 
    } 

    ord.compare(s1, s2) 
    } 
+0

HTTP를 읽은 후

def compare[M](s1: Seq[M], s2: Seq[M])(cmp: (M, M) => Int): Int = { implicit val orderM = new Ordering[M] { override def compare(x: M, y: M): Int = cmp(x, y) } scala.math.Ordering.Implicits.seqDerivedOrdering[Seq, M].compare(s1, s2) } 

그리고 아마도 동일한 코드의 약간 더 나은 버전 :이 같은 것을 시도해 볼 수도 있습니다 : //docs.scala-lang.org/tutorials/tour/implicit-parameters.html, 마지막 하나가 나에게 이해되기 시작했다. 아아, 주문 M은 더 이상 필요하지 않은 것 같습니다. 최소한 List [Int]와 List [String]은 제외하고 작동합니다 .-) 그리고 나서 정말 멋지고 간단합니다. – Harald

+0

Uuhm, 오, 이제 알겠습니다. orderM이 없으면, 내 cmp는 사용되지 않습니다. – Harald

1

내가 아는 한 어떤 것도 내장되어 있지 않습니다. 가장 컴팩트 한 것은 아마도 다음과 같습니다.

def compare[M](s1: Seq[M], s2: Seq[M], cmp: (M, M) => Int): Int = { 
    val diff = (s1 zip s2).find(x => cmp(x._1, x._2) != 0) 
    diff.map(x => cmp(x._1, x._2)).getOrElse(s1.length compare s2.length) 
} 

이터레이터를 사용하는 솔루션은 더 효율적이지만 컴팩트합니다.