如何将List中的两个连续元素转换为Map中的条目?

时间:2014-07-17 09:59:50

标签: scala

我有一个清单:

List(1,2,3,4,5,6)

我想转换为以下地图:

Map(1->2,3->4,5->6)

如何做到这一点?

4 个答案:

答案 0 :(得分:5)

大部分类似@Vakh答案,但语法更好:

val l = List(1,2,3,4,5,6)
val m = l.grouped(2).map { case List(key, value) => key -> value}.toMap
// Map(1 -> 2, 3 -> 4, 5 -> 6)

答案 1 :(得分:3)

尝试:

val l = List(1,2,3,4,5,6)
val m = l.grouped(2).map(l => (l(0), l(1))).toMap

答案 2 :(得分:3)

如果列表保证长度均匀:

val l = List(1,2,3,4,5,6)
val m = l.grouped(2).map { x => x.head -> x.tail.head }.toMap
// Map(1 -> 2, 3 -> 4, 5 -> 6)

但是如果list可能是奇数长度,请使用headOption:

val l = List(1,2,3,4,5,6,7)
val m = l.grouped(2).map(x => x.head -> x.tail.headOption).toMap
// Map(1 -> Some(2), 3 -> Some(4), 5 -> Some(6), 7 -> None)

答案 3 :(得分:0)

不使用迄今为止在答案中无处不在的grouped

scala> val l = (1 to 6).toList
l: List[Int] = List(1, 2, 3, 4, 5, 6)

scala> l.zip(l.tail).zipWithIndex.collect { case (e, pos) if pos % 2 == 0 => e }.toMap
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4, 5 -> 6)

您还可以使用slidingfoldLeft,如下所示:

scala> l.sliding(2,2).foldLeft(Map.empty[Int,Int]){ case (m, List(l, r)) => m + (l -> r) }
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4, 5 -> 6)