我试图在scala中实例化一个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]还是有一种简单的方法来实现元组比较?
答案 0 :(得分:1)
您可以将: Ordering
(context bound)添加到T
的定义中。
方法:
def method[T: Ordering] = {
var heads: ...
}
上课:
class MyClss[T: Ordering] {
var heads: ...
}
Ordering[T]
的每个子类型都有隐式对象Comparable
。但是对于许多其他类型也有这样的对象。例如TupleN
。
答案 1 :(得分: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)]
。