【问题标题】:From a List representation of a Map, to a real Map in Scala从 Map 的 List 表示,到 Scala 中的真实 Map
【发布时间】:2016-10-22 06:45:09
【问题描述】:

我想将键/值的 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:谢谢各位。大家的回复让我学到了很多!!

【问题讨论】:

  • 有什么问题?
  • @Dima 问题是是否有可能以更实用的方式实现此功能。我更新了问题。
  • 你能提供一个示例输入和预期输出吗?仅仅举一个简单的例子就可以提供足够的细节来得到答案。
  • @KevinMeredith 最后一行是例子的断言(输入数据和预期输出)

标签: algorithm scala functional-programming


【解决方案1】:

list.drop(1).grouped(2).map { x => x.head -> x.last }.toMap

【讨论】:

  • 人们可能更喜欢在grouped(2) 之后有一个.filter(_.length == 2),这样如果有一个没有值的尾随键,它就会被忽略。在尾随键的情况下,此代码将值设置为等于键。
【解决方案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: _*)

【讨论】:

  • 好一个。我更喜欢@Dima 的版本,因为它直接使用 .toMap。是否有任何理由使用 .toList 并在下一步中创建地图?谢谢!
  • grouped 方法返回和Iterator 的列表,你不能将它传递给Map 工厂方法,它需要一个Seq[Tuple2[A,B]],所以我添加了toList。确实,有很多方法可以实现您的目标,这就是 Scala 如此灵活的原因...... :) 和乐趣! :D
  • 谢谢!是的,它非常灵活和有趣。我开始坠入爱河。 :)
【解决方案3】:

也许你想要一些递归的:

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)
}

【讨论】:

    【解决方案4】:
    (for { Seq(k, v) <- list.tail.grouped(2) } yield k -> v).toMap
    

    也包括尾随键

    【讨论】:

    • 如果val list = Vector("ignored", "fish", "wish", "dish") 怎么办?我认为List(k, v) 需要是Seq(k, v)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2019-11-20
    • 2016-07-21
    相关资源
    最近更新 更多