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")
}