斯卡拉 - 元组
问题描述:
我试图在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]还是有一个简单的方法来实现元组比较?
答
您可以将: Ordering
(context bound)添加到T
的定义中。
对于方法:
def method[T: Ordering] = {
var heads: ...
}
对于类:
class MyClss[T: Ordering] {
var heads: ...
}
有用于Comparable
每种亚型隐式对象Ordering[T]
。但也有很多其他类型的对象。例如对于TupleN
。
答
由于您正在比较元组,因此还需要指定要使用哪个元素进行比较,例如,如果你想通过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)]
。
是否有一些特殊的原因只使用1个元素进行比较? – senia 2013-05-14 13:28:57
我不知道有[预定义的元组排序](http://www.scala-lang.org/api/current/index.html#scala.math.Ordering$),但有,所以'排序[(T,Int)]。compare()'也适用,如果你想按_1,_2排序。 – ValarDohaeris 2013-05-14 16:43:10