Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
List 如何在Scala中通过预处理将列表转换为可变映射?_List_Scala_Dictionary - Fatal编程技术网

List 如何在Scala中通过预处理将列表转换为可变映射?

List 如何在Scala中通过预处理将列表转换为可变映射?,list,scala,dictionary,List,Scala,Dictionary,我有一个列表(列表的大小是可变的): 并希望获得以下地图: val result= Map("foo:7:bar" -> "val1", "foo:8:bar" -> "val1", "foo:9:bar" -> "val1") 地图中的所有内容都是硬编码的,除了ID和值对于每个人都是相同的,但地图必须是可变的,我想稍后更新其中一个值: result("foo:8:bar") = "val2" val resul

我有一个列表(列表的大小是可变的):

并希望获得以下地图:

val result= Map("foo:7:bar" -> "val1",
                "foo:8:bar" -> "val1",
                "foo:9:bar" -> "val1")
地图中的所有内容都是硬编码的,除了ID和值对于每个人都是相同的,但地图必须是可变的,我想稍后更新其中一个值:

result("foo:8:bar") = "val2"
val result= Map("foo:7:bar" -> "val1",
                "foo:8:bar" -> "val2",
                "foo:9:bar" -> "val1")

您可以这样做:首先映射列表以生成元组列表,然后对结果调用
toMap
,这将使元组成为不可变的
map

val m = ids.map(id => ("foo:" + id + ":bar", "val1")).toMap
然后将不可变的
映射
转换为可变的
映射
,例如:

编辑-正如评论员所注意到的,中间不可变的
映射
是不必要的,您也可以这样做:

val mm = collection.mutable.Map(ids.map(id => ("foo:" + id + ":bar", "val1")): _*)
试试这个:

import scala.collection.mutable
val ids = List(7, 8, 9)
val m = mutable.Map[String, String]()
ids.foreach { id => m.update(s"foo:$id:bar", "val1") }

scala> m
Map(foo:9:bar -> val1, foo:7:bar -> val1, foo:8:bar -> val1)
您不需要创建任何中间对象,
map
可以创建任何中间对象。

尝试如下操作:

scala> import scala.collection.mutable
scala> val result = mutable.Map[String, String]()
result: scala.collection.mutable.Map[String,String] = Map()

scala> val ids = List(7, 8, 9)
ids: List[Int] = List(7, 8, 9)

scala> for(x <- ids){
     | result("foo:%d:bar".format(x)) = "val1"
     | }

scala> result
res3: scala.collection.mutable.Map[String,String] = Map(foo:9:bar -> val1, foo:7:bar -> val1, foo:8:bar -> val1)
scala>导入scala.collection.mutable
scala>val result=mutable.Map[String,String]()
结果:scala.collection.mutable.Map[String,String]=Map()
scala>valids=List(7,8,9)
id:List[Int]=List(7,8,9)
scala>for(x结果)
res3:scala.collection.mutable.Map[String,String]=Map(foo:9:bar->val1,foo:7:bar->val1,foo:8:bar->val1)

为什么不使用
foldLeft

ids.foldLeft(mutable.Map.empty[String, String]) { (m, i) => 
  m += (s"foo:$i:bar" -> "val1")
}

似乎没有必要先调用
toMap
,然后调用
toSeq
。这可以在某种程度上简化为
collection.mutable.Map(ids-Map{ix=>s“foo:$ix:bar”->“val1”}:*)
@Shadowlands您可能想将注释转换为答案,这比其他现有答案要好。
scala> import scala.collection.mutable
scala> val result = mutable.Map[String, String]()
result: scala.collection.mutable.Map[String,String] = Map()

scala> val ids = List(7, 8, 9)
ids: List[Int] = List(7, 8, 9)

scala> for(x <- ids){
     | result("foo:%d:bar".format(x)) = "val1"
     | }

scala> result
res3: scala.collection.mutable.Map[String,String] = Map(foo:9:bar -> val1, foo:7:bar -> val1, foo:8:bar -> val1)
ids.foldLeft(mutable.Map.empty[String, String]) { (m, i) => 
  m += (s"foo:$i:bar" -> "val1")
}