2017-05-28 42 views

回答

2

A Map通常是一個無序的集合。更確切地說,Map是一個Set的鍵值附加到它們。由於Set僅具有不同的元素,並且未訂購,所以Map s也是如此。

的SortedMap [字符串,INT]

然而,有一個Map與排序鍵的實現,這是SortedMap。它使用隱含的Ordering[Key]來保持按鍵排序的鍵值對(請注意,它保持鍵的唯一性,因此對於給定鍵不能有兩個值)。

例如

SortedMap(-1 -> "neg", 1 -> "pos") + (0 -> "zero") == 
    SortedMap(-1 -> "neg", 0 -> "zero", 1 -> "pos") 

然而,在你的情況下,可能很難保持一個隱含Ordering[String]不同於平常的一個(這是字典序)。

序列[(字符串,整數)

您可能要轉換您Map[String, Int]Seq[(String, Int)]。這樣,你可以玩你的值的順序,但你會放棄快速查找給定的鍵。

如果您想這樣做,您可以先按順序使用鍵列表指定您的訂單,然後使用原始地圖在其上進行映射。

val original: Map[String, Int] = Map("d" -> 4, "a" -> 12, "c" -> 30, "b" -> 2) 
orderedMap: List[(String, Int)] = for { 
    key <- List("d", "b", "a", "c") 
    value <- original.get(key) 
    } yield key -> value 

請注意,我用original.get(key)避免出現實際上沒有在原來的地圖定義你的鑰匙之一的情況。

現在,得到一個值對於給定的關鍵,使用這種List[(String, Int)]類型,你所要做的

def getKey(key: String): Option[Int] = orderedMap. 
    find(_._1 == key). //find the first pair where the first element is the desired key 
    map(_._2) // keep only the value if it exists. 
0

SortedMap.apply採取定義的隱Ordering。例如:

implicit val stringReverse = Ordering.String.reverse 
val xs = Map("a" -> 3, "b" -> 5) 
SortedMap(xs.toList:_*) // Map(b -> 5, a -> 3) 

How to define own Ordering