2016-11-05 11 views
5

スカラを初めて使用し、マップ上でマップ関数を試してみました。別のマップ機能と結果ここでスカラ - マップ関数 - マップの最後の要素のみが返される

scala> val result1 = map1.map(kv => (kv._1.toUpperCase, kv._2)) 
    result1: scala.collection.immutable.Map[String,Int] = 
      Map(ABC -> 1, EFG -> 2, HIJ -> 3) 

されています:

scala> val result1 = map1.map(kv => (kv._1.length, kv._2)) 
    result1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 3) 

最初のマップ機能が戻る。ここ

scala> val map1 = Map ("abc" -> 1, "efg" -> 2, "hij" -> 3) 
    map1: scala.collection.immutable.Map[String,Int] = 
      Map(abc -> 1, efg -> 2, hij -> 3) 

は、map関数と結果である: ここに私の地図ですしかし、2番目のマップ関数はマップの最後のメンバーのみを返します。誰かがなぜこれが起こっているのか説明できますか?

ありがとうございます!

答えて

8

Scalaでは、Mapに重複キーを設定することはできません。新しいkey -> valueペアをMapに追加すると、そのキーがすでに存在する場合は、以前の値を上書きします。コレクションの関数演算からマップを作成する場合は、各ユニークキーの最後のインスタンスに対応する値になります。作成した例では、元のマップmap1の各文字列キーの長さが同じであるため、すべての文字列キーは同じ整数のキー3result1)を生成します。計算にボンネットの下に何が起こっているのかresult1です:

  1. 新しい空のマップが
  2. 作成されますが3 -> 3"abc" -> 1をマップし、マップに追加します。結果には1 -> 3が含まれています。
  3. "efg" -> 23 -> 2にマップし、マップに追加します。キーは同じなので、既存の値はkey = 3に上書きされます。結果は2 -> 3になりました。
  4. "hij" -> 33 -> 3にマップし、マップに追加します。キーは同じなので、既存の値はkey = 3に上書きされます。結果には3 -> 3が含まれています。
  5. 結果を返します。これはMap(3 -> 3です)。

注:マップイテレータの要素の順序は、宣言で書いた順序と同じであるという単純な前提がありました。順序はハッシュビンによって決定され、要素を追加した順序とおそらく一致しないので、この前提に依存するものは構築しないでください。

+0

ありがとう、ティム! – chandlerlx

関連する問題