Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala mutable.ListMap的奇怪行为_Scala_Collections - Fatal编程技术网

Scala mutable.ListMap的奇怪行为

Scala mutable.ListMap的奇怪行为,scala,collections,Scala,Collections,我正在尝试使用列表中的值筛选列表映射。但在输出mutable.ListMap中不维护顺序。这是一个简化的代码。由于需要执行约束和验证检查,我无法使用过滤器执行此操作 这是我的密码 val inMap = scala.collection.immutable.ListMap((1,5),(2,4),(3,5),(7,6)) val alist= List(1,2,3) val mutableTempMap = scala.collection.mutable.ListMap.empty[Int,

我正在尝试使用
列表中的值筛选
列表映射
。但在输出
mutable.ListMap
中不维护顺序。这是一个简化的代码。由于需要执行约束和验证检查,我无法使用
过滤器
执行此操作

这是我的密码

val inMap = scala.collection.immutable.ListMap((1,5),(2,4),(3,5),(7,6))
val alist= List(1,2,3)
val mutableTempMap = scala.collection.mutable.ListMap.empty[Int, Int]

for (jkey <- alist) {
  inMap.get(jkey) match {
    case Some(y) => mutableTempMap(jkey) = y
    case None    =>
  }
}

mutableTempMap
预期产出

scala.collection.mutable.ListMap[Int,Int] = Map(1 -> 5, 2 -> 4, 3 -> 5)

如果使用不可变的
列表映射
,则会保持顺序。可变性(抖动)可以通过
var
实现

var ilm = collection.immutable.ListMap.empty[Int,Int]
ilm = ilm + (1 -> 5)
ilm = ilm + (2 -> 4)
ilm = ilm + (3 -> 5)
// ilm: immutable.ListMap[Int,Int] = Map(1 -> 5, 2 -> 4, 3 -> 5)

如果使用不可变的
列表映射
,则会保持顺序。可变性(抖动)可以通过
var
实现

var ilm = collection.immutable.ListMap.empty[Int,Int]
ilm = ilm + (1 -> 5)
ilm = ilm + (2 -> 4)
ilm = ilm + (3 -> 5)
// ilm: immutable.ListMap[Int,Int] = Map(1 -> 5, 2 -> 4, 3 -> 5)

首先,由于
ListMap
在幕后是一个单独的链表,所以与var-immutable相比,可变版本绝对没有性能

显然,它确实有一个奇怪的插入模式,所以让我们测试一下:

val m = collection.mutable.ListMap.empty[Int,Int]
(1 to 10).foreach {i =>
   m(i) = i
   println(m)
}
生成此输出。请注意,每次插入后,尾部是如何反转的,因此这就是您的答案

Map(1 -> 1)
Map(2 -> 2, 1 -> 1)
Map(3 -> 3, 1 -> 1, 2 -> 2)
Map(4 -> 4, 2 -> 2, 1 -> 1, 3 -> 3)
Map(5 -> 5, 3 -> 3, 1 -> 1, 2 -> 2, 4 -> 4)
Map(6 -> 6, 4 -> 4, 2 -> 2, 1 -> 1, 3 -> 3, 5 -> 5)
Map(7 -> 7, 5 -> 5, 3 -> 3, 1 -> 1, 2 -> 2, 4 -> 4, 6 -> 6)
Map(8 -> 8, 6 -> 6, 4 -> 4, 2 -> 2, 1 -> 1, 3 -> 3, 5 -> 5, 7 -> 7)
Map(9 -> 9, 7 -> 7, 5 -> 5, 3 -> 3, 1 -> 1, 2 -> 2, 4 -> 4, 6 -> 6, 8 -> 8)
Map(10 -> 10, 8 -> 8, 6 -> 6, 4 -> 4, 2 -> 2, 1 -> 1, 3 -> 3, 5 -> 5, 7 -> 7, 9 -> 9)

我可能会认为这是一个bug,尽管映射是不有序的。

首先,由于
ListMap
在幕后是一个单独链接的列表,与var immutable相比,可变版本绝对没有性能

显然,它确实有一个奇怪的插入模式,所以让我们测试一下:

val m = collection.mutable.ListMap.empty[Int,Int]
(1 to 10).foreach {i =>
   m(i) = i
   println(m)
}
生成此输出。请注意,每次插入后,尾部是如何反转的,因此这就是您的答案

Map(1 -> 1)
Map(2 -> 2, 1 -> 1)
Map(3 -> 3, 1 -> 1, 2 -> 2)
Map(4 -> 4, 2 -> 2, 1 -> 1, 3 -> 3)
Map(5 -> 5, 3 -> 3, 1 -> 1, 2 -> 2, 4 -> 4)
Map(6 -> 6, 4 -> 4, 2 -> 2, 1 -> 1, 3 -> 3, 5 -> 5)
Map(7 -> 7, 5 -> 5, 3 -> 3, 1 -> 1, 2 -> 2, 4 -> 4, 6 -> 6)
Map(8 -> 8, 6 -> 6, 4 -> 4, 2 -> 2, 1 -> 1, 3 -> 3, 5 -> 5, 7 -> 7)
Map(9 -> 9, 7 -> 7, 5 -> 5, 3 -> 3, 1 -> 1, 2 -> 2, 4 -> 4, 6 -> 6, 8 -> 8)
Map(10 -> 10, 8 -> 8, 6 -> 6, 4 -> 4, 2 -> 2, 1 -> 1, 3 -> 3, 5 -> 5, 7 -> 7, 9 -> 9)

我可能会认为这是一个bug,尽管映射没有顺序。

认为
mutable.ListMap
保持顺序的假设是错误的。它不在合同里。最好的选择是使用
LinkedHashMap

另请参见:


认为
mutable.ListMap
维持顺序的假设是错误的。它不在合同里。最好的选择是使用
LinkedHashMap

另请参见: