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 に答える