1

Map[Long, String]キーの降順で繰り返し処理したい があります。これを行うために私が選んだ方法は次のとおりです。

var m: SortedMap[Long, String] = TreeMap.empty( (l: Long) => -l)
m ++= Map(2L -> "Hello", 1L -> "World", 3L -> "Chris")
println(m) //Map(3 -> Chris, 1 -> World, 2 -> Hello)

なぜこれがうまくいかなかったのか理解できず、ばかげた間違いを犯したとしか思えません。もちろん、次のように動作します。

var m: SortedMap[Long, String] = TreeMap.empty( (l: Long) => new Ordered[Long] {
  def compare(a: Long) = -l.compare(a)
})
m ++= Map(2L -> "Hello", 1L -> "World", 3L -> "Chris")
println(m) //Map(3 -> Chris, 2 -> Hello, 1 -> World)
4

1 に答える 1

4

トリッキー。そのソートを実行しましょう:

scala> (-3L).compare(1L)
res13: Int = -1

scala> (-1L).compare(2L)
res14: Int = -1

したがって、3 < 1 < 2 であると結論付けます。これは、なぜ次のことが機能するのかという疑問を生じさせます。

def compare(a: Long) = -l.compare(a)

何をしているのかを確認するために、そこに括弧を入れましょう。

def compare(a: Long) = -(l.compare(a))

さて、答えは明らかです。の結果を反転しているため、compare機能します。最初にやったのとは何か違う。

于 2009-12-01T18:25:01.567 に答える