从Map的List表示形式到Scala中的真实Map

时间:2016-06-20 21:37:35

标签: algorithm scala functional-programming

我想将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:谢谢大家。我和每个人的反应都在学习很多!!

4 个答案:

答案 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

也包括尾随键