1

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

4

2 回答 2

1

您可以将: Ordering上下文绑定)添加到T.

对于方法:

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

上课:

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

Ordering[T]的每个子类型都有一个隐式对象Comparable。但也有许多其他类型的对象。例如对于TupleN.

于 2013-05-14T13:06:34.567 回答
1

由于您正在比较元组,因此您还需要指定用于比较的元素,例如,如果您想按 type 的第一个元素排序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)].

于 2013-05-14T13:11:00.837 回答