Scala将字符串列表转换为键值映射

5

我有一个单一的有序字符串数组,从外部系统以以下形式导入:

val l = List("key1", "val1", "key2", "val2", etc...)

如何使用Scala将此转换为映射,以便可以遍历键并获取关联值?

谢谢


2
你尝试过什么吗? - vptheron
3个回答

8

我的回答与Daniel的类似,但我会使用collect而不是map

l.grouped(2).collect { case List(k, v) => k -> v }.toMap

如果您有一个带有未匹配key的列表,这不会抛出异常:
scala>   val l = List("key1", "val1", "key2", "val2", "key3")
l: List[String] = List(key1, val1, key2, val2, key3)

scala> l.grouped(2).collect { case List(k, v) => k -> v }.toMap
res22: scala.collection.immutable.Map[String,String] = Map(key1 -> val1, key2 -> val2)

scala> l.grouped(2).map { case List(k, v) => k -> v }.toMap
scala.MatchError: List(key3) (of class scala.collection.immutable.$colon$colon)

一些背景信息,grouped 返回一个 List[List[String]],其中每个内部列表都有两个元素:

scala> l.grouped(2).toList // the toList is to force the iterator to evaluate.
res26: List[List[String]] = List(List(key1, val1), List(key2, val2))

使用collect方法在内部列表上匹配并创建一个元组,最后通过toMap方法将列表转换为Map


通常最好在意外数据上失败,而不是默默地更改它。例如,由于一个偏移量错误,可能会导致在源列表中失去一个值。使用Daniel的答案,您将得到一个异常,进行调查并修复;而使用您的答案,您将不会得到异常,只会丢失数据,并希望它能被测试或检查结果所检测出来。 - Alexey Romanov
@AlexeyRomanov 在这种情况下可能失败更有意义,这完全取决于操作概念中的意外数据(例如,您也可以拥有一个偶数列表,但是其中有两个连续的键),由于列表元素之间没有严格的关系,因此很难从问题中说出来,但您提出了一个很好的观点。 - Ende Neu

3
l.grouped(2).map { case List(k, v) => k -> v }.toMap

-1

你需要将它们成对,然后提供给一个映射表

val lst: List[String] = List("key1", "val1", "key2", "val2")
val pairs = lst zip lst.tail
val m: Map[String,String] = pairs.toMap

1
lst zip lst.tail 返回 List((key1,val1), (val1,key2), (key2,val2)),请注意第二个元组 (val1,key2) - Ende Neu
1
哎呀,是我犯了个愚蠢的错误。如果在你的映射中有一些值可能作为键不合适的话,我建议你采纳这个答案。 - Cameron Cook
这段代码与 OP 的要求不符,请删除答案。 - Alexandr Nikitin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接