我想将Seq的键/值转换为Map。序列的第一个元素是保留的,因此对的列表从位置1开始。
问题是:是否可以使用更实用的方式实现此功能?
def list2Map(plainMap:Seq[String]) = {
var map = Map[String, String]()
var idx = 1;
while(plainMap.size > idx) {
val key = plainMap(idx)
idx += 1
val value = plainMap(idx)
idx += 1
map = map + (key -> value)
}
map
}
assert( list2Map( Seq("reserved slot","key0","value0","key1","value1","key2","value2") ) == Map( ("key0"->"value0"),("key1"->"value1"),("key2"->"value2") ) )
我是Scala的新手,我知道有很多不同的方法可以迭代一个集合,但我没有找到一种forEach方法来读取每个迭代的两个元素,从元素1开始。
PS:谢谢大家。我和每个人的反应都在学习很多!!答案 0 :(得分:4)
list.drop(1).grouped(2).map { x => x.head -> x.last }.toMap
答案 1 :(得分:2)
你的意思是这样的?:
val list = List("reserved slot", "key0", "value0", "key1", "value1", "key2", "value2")
val list4Map = list.tail.grouped(2).map { listBy2 => (listBy2(0), listBy2(1)) }.toList
val map = Map(list4Map: _*)
答案 2 :(得分:0)
也许你想要一些递归的:
def seq2Map[T](seq: Seq[T]) = {
def rec(seq: Seq[T], map: Map[T,T] = Map.empty[T,T]): Map[T,T] = seq match {
case h :: t :: e => rec(e, map + (h -> t))
case _ => map
}
rec(seq.tail)
}
答案 3 :(得分:0)
(for { Seq(k, v) <- list.tail.grouped(2) } yield k -> v).toMap
也包括尾随键