2011-01-25 174 views
23

我怎麼排序地圖這樣的:斯卡拉地圖排序

"01" -> List(34,12,14,23), "11" -> List(22,11,34) 

由年初值?

+0

您是否需要將結果作爲另一張地圖,或者您是否只希望在用於排序時忘記密鑰? – 2011-01-25 12:42:13

+0

我需要結果在另一張地圖。 – 2011-01-25 12:42:54

回答

57

一種方法是使用scala.collection.immutable.TreeMap,它總是通過關鍵字排序:

val t = TreeMap("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 

//If you have already a map... 
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 
//... use this 
val t = TreeMap(m.toSeq:_*) 

你可以將其轉換爲一個序列或列表和排序它,太:

//by specifying an element for sorting 
m.toSeq.sortBy(_._1) //sort by comparing keys 
m.toSeq.sortBy(_._2) //sort by comparing values 

//by providing a sort function 
m.toSeq.sortWith(_._1 < _._1) //sort by comparing keys 

有很多的可能性,每種方式在某種情況下或多或少方便。

15

如前所述,默認Map類型是無序的,但總有SortedMap

import collection.immutable.SortedMap 
SortedMap("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 

雖然我猜你不能使用,因爲我認識到這一點功課,並懷疑您的地圖是結果的一組操作。所以,你必須創建一個空的SortedMap,並添加值:

val unsorted = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 
val sorted = SortedMap.empty[String, List[Int]] ++ unsorted 
//or 
val sorted = SortedMap(unsorted.toSeq:_*) 

或者,如果你不拘泥於Map界面,你可以將其轉換爲一個元組的序列。請注意,只有在鍵和值都具有定義的順序時,此方法纔有效。列表沒有定義默認順序,所以這不適用於您的示例代碼 - 我因此改爲創建其他數字。

val unsorted = Map("01" -> 56, "11" -> 34) 
val sorted = unsorted.toSeq.sorted 

,如果你可以先轉換您的列表,以一些其他類型(如字符串),這是最好的使用mapValues

更新完成,這可能是有用的:見Landei的答案,它展示瞭如何你可以提供一個定製的排序功能,使這種方法的工作。