Scala - 元组TreeSet

时间:2013-05-14 12:54:05

标签: scala comparable treeset

我试图在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]还是有一种简单的方法来实现元组比较?

2 个答案:

答案 0 :(得分:1)

您可以将: Orderingcontext 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)]