2009-12-01 88 views
1

我有一個Map[Long, String],我想按鍵的順序迭代。我選擇了做,這是如下的方式:Scala TreeMap陌生;實現逆序排序

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

棘手。讓我們來運行排序:

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

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

因此,我們得出結論,3 2.這引出爲什麼以下工作的問題:

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

好了,讓我們把一些括號那裏,確保我們知道我們在做什麼

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

好的,那麼答案很清楚。你正在反轉compare的結果,這就是它工作的原因。這與你第一次做的有些不同。

+0

我認爲視圖被應用於作爲目標和比較參數的鍵(即'( - 3L).compare(-1L) – 2009-12-01 21:06:59