2017-05-28 10 views

答えて

2

Mapは、通常、順序付けられていないコレクションです。より正確には、Mapは、値が付いたキーのSetです。 Setは異なる要素しか持たず、注文されていないので、Mapもそうです。

のSortedMap [文字列、INT]

しかしながら、ソートされたキーを持つMapの実装があり、それはSortedMapです。暗黙的にOrdering[Key]を使用して、キーでキーと値のペアを並べた状態にします(キーの統一性が保たれているため、特定のキーに対して2つの値を持つことはできません)。

例えば

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

しかし、あなたの場合には、(辞書式順序で)通常とは異なる暗黙のOrdering[String]を維持するのは難しいかもしれません。

のSeq [(文字列、INT)]

あなたのMap[String, Int]Seq[(String, Int)]に変換したい場合があります。そうすれば、あなたはあなたの値の順序で遊ぶことができますが、あなたは特定のキーの高速検索を失います。

これを行うには、まずキーのリストを使用して順序を指定してから、元のマップを使用して順序を指定します。私はあなたの鍵の一つは、実際にオリジナルのマップで定義されていない場合を避けるためにoriginal.get(key)を使用

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 

注意。

今、与えられたキーに対する値を取得するには、この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

関連する問題