2013-05-14 204 views
1

我试图在Scala中实例化一个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

您可以将: Orderingcontext bound)添加到T的定义中。

对于方法:

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

对于类:

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

有用于Comparable每种亚型隐式对象Ordering[T]。但也有很多其他类型的对象。例如对于TupleN

1

由于您正在比较元组,因此还需要指定要使用哪个元素进行比较,例如,如果你想通过T类型的第一个元素下令:

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)]

+0

是否有一些特殊的原因只使用1个元素进行比较? – senia 2013-05-14 13:28:57

+1

我不知道有[预定义的元组排序](http://www.scala-lang.org/api/current/index.html#scala.math.Ordering$),但有,所以'排序[(T,Int)]。compare()'也适用,如果你想按_1,_2排序。 – ValarDohaeris 2013-05-14 16:43:10