2014-07-17 37 views

回答

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) 
+0

我同意:語法是更好:) –

3

嘗試:

val l = List(1,2,3,4,5,6) 
val m = l.grouped(2).map(l => (l(0), l(1))).toMap 
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) 

但如果列表可能是奇數長度,請使用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) 
+0

我想,在奇長的情況下,最好使用'padTo'方法 –

+0

@ om-nom-nom'padTo'會迫使我們選擇一個隨機值來表示'缺失'。使用Option的教科書案例。 –

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) 
相關問題