15

値を指定して、マップ内のキーを見つけようとしています。正しい述語を見つけられないため、「検索」機能を使用しています。

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
  }

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

4

4 に答える 4

2

findinの署名Mapfind(p: ((A, B)) ⇒ Boolean): Option[(A, B)]. したがって、述語は a を取り、 aTuple2を返さなければなりませんBoolean。キー入力もであるため、に変更valueしたことに注意してください。IntcolorsInt

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)
于 2013-10-24T17:41:57.080 に答える
1

いつでも抽象ソリューションを使用して、キーをその値と交換し、それを新しいマップに保存してから、新しいマップを検索できます。

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}実際にキーとその値を交換します。

于 2015-11-13T23:04:41.937 に答える
0

マップを find メソッドに渡すのは避け、マップのキーのみを find メソッドに渡します。

これにより、 Option[Int,String]の処理が回避されます。代わりに、それはOption[Int]になります。

// sample data
val colors = Map(1 -> "red", 2 -> "blue", 3 -> "yellow")

// function you need
def keyForValue(theMap: Map[Int, String], theValue: String): Int = {

    val someKey = theMap.keys.find( k => theMap(k) == theValue )
    someKey match {
        case Some(key) => {
            println(s"the map contains ${key} -> ${theValue}")
            return key
        }
        case None => {
            println(s"a key was not found for ${theValue}")
            return -1
        }
    }
}

これは与える:

scala> val result = keyForValue( colors, "blue" )
the map contains 2 -> blue
result: Int = 2

scala>
于 2019-01-03T17:46:12.797 に答える