2013-10-24 10 views
7

値が与えられているマップでキーを見つけようとしています。私はそれのために右の述語を把握することができないことによって、「検索」機能を使用しています:スカラのマップにfind関数を使用する

val colors = Map(1 -> "red", 2 -> "blue") 
def keyForValue(map: Map[Int, String], value: String) = { 
    val bool = map.find{map.foreach{map.values(i) == value}} 
     bool.key 
    } 

私はマップを反復処理し、私は価値を知っているとき、キーを見つけるにはどうすればよいですか?

答えて

10

あなたはListのように述語の同じ種類を使用しますが、覚えておいてくださいあなたは評価していますそれはちょうど値の代わりに(key,value)の対を超えて(そして、 ckでも!)

簡単な例:

val default = (-1,"") 
val value = "red" 
colors.find(_._2==value).getOrElse(default)._1 
+0

いくつか「赤」を返します。 –

+3

@Core_Dumped:私はあなたがおそらくすでにそれを理解しているということを承諾したと仮定しますが、その場合には、実際には答えとしてコードを実行すると、キーを取得しますこれは '.getOrElse(default)._1 'のためのもので、' find'から取得した 'Option'から値を抽出します。デフォルトで' _1'は得られたペアの最初の要素を取得しますこれはマップの場合にはキーとなることがあります。 –

2

findの署名はMapです。find(p: ((A, B)) ⇒ Boolean): Option[(A, B)]です。したがって、述語はTuple2をとり、Booleanを返す必要があります。注をに変更しました。のキーもIntであるためです。

scala> def keyForValue(map: Map[Int, String], value: Int) = { 
    | colors.find({case (a,b) => a == value}) 
    | } 
keyForValue: (map: Map[Int,String], value: Int)Option[(Int, String)] 

テスト:

scala> keyForValue(colors, 1) 
res0: Option[(Int, String)] = Some((1,red)) 

またgetを使用することができます。

scala> colors.get(1) 
res1: Option[String] = Some(red) 
0

あなたはいつも抽象的な溶液で行くとその値を持つキーを交換する、新しいマップに格納し、その後、新しいマップを検索することができます。

val colors = Map(1 -> "red", 2 -> "blue") 
def keyForValue(map: Map[Int, String], value: String) = { 
    val revMap = map map {_.swap} 
    val key = revMap(value) 
    key 
} 

3行目は、キーを値と入れ替え、revMapに格納します。 (map mapは、マップの名前を意味します(この場合はパラメータ、マップ、次に単語マップ、次に{_.swap})。

関連する問題