2013-05-14 3 views
1

의 TreeSet의이 :스칼라 -이 같은 튜플의 특정 비교기를 전달 나는 스칼라에 TreeSet의 인스턴스를하려고 튜플

var heads: java.util.TreeSet[(T, Int)] = new java.util.TreeSet[(T, Int)](new Comparator[(T,Int)] { 
    def compare(o1: (T, Int), o2: (T, Int)): Int = Ordering[(T, Int)].compare(o1, o2) 
    }) 

그러나, T에 암시 적 순서를 찾을 수 없습니다. T < : 유형 계층 구조에서 Comparable [T]를 지정해야합니까? 아니면 튜플 비교를 수행하는 간단한 방법이 있습니까?

답변

1

T의 정의에 : Ordering (context bound)을 추가 할 수 있습니다. 방법

:

def method[T: Ordering] = { 
    var heads: ... 
} 

클래스 :

class MyClss[T: Ordering] { 
    var heads: ... 
} 

Comparable의 각 하위 유형에 대한 내장 객체 Ordering[T] 있습니다. 그러나 또한 많은 다른 유형을위한 그런 목표가있다. 예로는 TupleN입니다.

1

튜플을 비교하기 때문에 비교에 사용할 요소를 지정해야합니다.

object Main extends App { 
    import java.util.Comparator 
    def heads[T: Ordering] = new java.util.TreeSet[(T, Int)](new Comparator[(T,Int)] { 
    def compare(o1: (T, Int), o2: (T, Int)): Int = Ordering.by[(T, Int), T](_._1).compare(o1, o2) 
    }) 
    val test = heads[String] 
    test.add(("Foo", 42)) 
    test.add(("Foo", 42)) 
    test.add(("Bar", 17)) 
    println(test) 
} 

이 출력됩니다 [(Bar,17), (Foo,42)]을 : 당신은 유형 T의 첫 번째 요소로 주문합니다.

+0

비교를 위해 단 하나의 요소 만 사용해야하는 특별한 이유가 있습니까? – senia

+1

[튜플에 대한 사전 정의 된 주문] (http://www.scala-lang.org/api/current/index.html#scala.math.Ordering$)이 있다는 것을 알지 못했지만, _1, _2 순으로 정렬하려면 [(T, Int)]. compare()'를 순서대로 정렬해야합니다. – ValarDohaeris