【问题标题】:Convert Scala's list into map with indicies as keys将 Scala 列表转换为以索引为键的映射
【发布时间】:2013-07-23 14:23:26
【问题描述】:

我想做的就是转换以下内容:

List(2, 4, 6, 8, 10)Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10 )。换句话说,将索引映射到值。这应该很容易,但我错过了一些东西。

谁能提出一个简单的方法来做到这一点?

UPD:只是为了概括解决方案。假设我需要对值进行额外的转换。例如,用List(_) 包装它。在我们的例子中:

List(2, 4, 6, 8, 10) -> Map(0 -> List(2), 1 -> List(4), 2 -> List(6), 3 -> List(8), 4 -> List(10))

【问题讨论】:

  • 为什么不直接将其转换为IndexedSeq(即myList.toIndexedSeq)?它会更快并且(可能)更紧凑。
  • 我需要一张地图,因为我打算在功能中使用值/键执行一些额外的操作。但是是的,如果您需要快速随机访问,IndexedSeq 将是最好的解决方案。

标签: list scala collections map


【解决方案1】:
List(2, 4, 6, 8, 10).zipWithIndex.map(_.swap).toMap

【讨论】:

  • 顺便说一句,.zipWithIndex.toMap 没有生成从索引到值的映射,这有点令人遗憾。
  • 它被称为“zipWithIndex”而不是“zipIndexWithValues”,所以这个顺序确实有些有意义。
  • 我更喜欢 @om-nom-nom 的解决方案,因为它不需要我重复 xs 符号。这对我很重要,因为我正在尝试将其添加到长链的末尾。
  • 别忘了zipWithIndex 会触发一个额外的集合迭代,这可以通过使用view 来解决。所以,而不是:List(2, 4, 6, 8, 10).zipWithIndex.map(_.swap).toMap 你应该这样做:List(2, 4, 6, 8, 10).view.zipWithIndex.map(_.swap).toMap
【解决方案2】:

UPD:如果您想转换值,您可以使用已经发布的解决方案之一,然后使用地图的mapValues,或者您可以预先应用转换:

List(2, 4, 6, 8, 10).zipWithIndex.map { case (v, i) => i -> List(v) }.toMap
res0: Map[Int,List[Int]] = Map(0 -> List(2), 1 -> List(4), 2 -> List(6), 3 -> List(8), 4 -> L
ist(10))

【讨论】:

    【解决方案3】:
    val xs = List(2, 4, 6, 8, 10)
    (xs.indices zip xs).toMap
    // Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10)
    

    【讨论】:

    • 只是好奇:您认为这是最有效的方法吗?
    • @ErikAllik 如果你的意思是 performance,我认为手写的 while 循环在紧密循环中效率更高,但至于此处列出的其他解决方案(基于 zipWithIndex 的解决方案) ) 它应该表现出相同的性能特征。
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多