3

3 つのマップ a、b、c を連結すると、結果はそれぞれの元のマップと同じ順序になると予想されます。しかし、以下に示すように、結果はマップが b、a、c のようになります。

  Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26).
  Type in expressions to have them evaluated.
     Type :help for more information.

  scala> import collection.mutable
  import collection.mutable

  scala> val a = mutable.Map(1->2)
  a: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2)

  scala> val b = mutable.Map(2->2)
  b: scala.collection.mutable.Map[Int,Int] = Map(2 -> 2)

  scala> val c = mutable.Map(3->2)
  c: scala.collection.mutable.Map[Int,Int] = Map(3 -> 2)

  scala> a ++ b ++ c
  res0: scala.collection.mutable.Map[Int,Int] = Map(2 -> 2, 1 -> 2, 3 -> 2)

4 つのマップの場合、b、d、a、c を示します。2 つの b、a の場合。結果のマップは、元の順序に関係なく、常に同じ順序になります。


答えのテスト:

  Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26).
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> import collection.mutable.LinkedHashMap
  import collection.mutable.LinkedHashMap

  scala> val a = LinkedHashMap(1 -> 2)
  a: scala.collection.mutable.LinkedHashMap[Int,Int] = Map(1 -> 2)

  scala> val b = LinkedHashMap(2 -> 2)
  b: scala.collection.mutable.LinkedHashMap[Int,Int] = Map(2 -> 2)

  scala> val c = LinkedHashMap(3 -> 2)
  c: scala.collection.mutable.LinkedHashMap[Int,Int] = Map(3 -> 2)

  scala> a ++ b ++ c
  res0: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2, 2 -> 2, 3 -> 2)
4

1 に答える 1

10

Scala のMap(Java のような) には、反復順序が定義されていません。挿入順序を維持する必要がある場合は、 a ListMap(不変) または a LinkedHashMap(不変) を使用できます。

scala> import collection.mutable.LinkedHashMap
import collection.mutable.LinkedHashMap

scala> val a = LinkedHashMap(1 -> 2)
a: scala.collection.mutable.LinkedHashMap[Int,Int] = Map(1 -> 2)

scala> a += (2 -> 2)
res0: a.type = Map(1 -> 2, 2 -> 2)

scala> a += (3 -> 2)
res1: a.type = Map(1 -> 2, 2 -> 2, 3 -> 2)

scala> a
res2: scala.collection.mutable.LinkedHashMap[Int,Int] = Map(1 -> 2, 2 -> 2, 3 -> 2)

しかし、一般に、要素の順序を気にする場合は、おそらく別のデータ構造を使用した方がよいでしょう。

于 2013-02-06T01:35:42.453 に答える