【问题标题】:Scala Convert Set to MapScala 转换集到地图
【发布时间】:2011-06-18 14:17:20
【问题描述】:

如何将 Set("a","b","c") 转换为 Map("a"->1,"b"->2,"c"->3)? 我认为它应该与 toMap 一起使用。

【问题讨论】:

  • 您是否希望 b 映射到 2,因为它是 Set 中的第二个?还是因为它是字母表中的第二个字母?正如其他海报所指出的那样,套装没有排序,所以第一个不起作用。

标签: scala scala-collections


【解决方案1】:

zipWithIndex 可能是您正在寻找的。它将获取您的字母集合并创建一个新的元组集合,将值与集合中的位置相匹配。不过,您还有一个额外要求 - 看起来您的位置以 1 而不是 0 开头,因此您需要转换这些元组:

Set("a","b","c")
  .zipWithIndex    //(a,0), (b,1), (c,2)
  .map{case(v,i) => (v, i+1)}  //increment each of those indexes
  .toMap //toMap does work for a collection of Tuples

一个额外的考虑 - 集合不保留位置。如果您希望上述位置始终有效,请考虑使用类似 List 的结构。

【讨论】:

    【解决方案2】:

    这是另一种解决方案,它使用从 1 开始的所有自然数的 Stream 与您的 Set 一起压缩:

    scala> Set("a", "b", "c") zip Stream.from(1) toMap
    Map((a,1), (b,2), (c,3))
    

    【讨论】:

      【解决方案3】:

      toMap 仅在 Set 条目是键/值对(例如 Set(("a",1),("b",2),("c",3)))时才有效。

      要得到你想要的,请使用zipWithIndex

      Set("a","b","c") zipWithIndex
      // Set[(String, Int)] = Set((a,0), (b,1), (c,2))
      

      或(如你原来的问题):

      Set("a","b","c") zip (1 to 3) toMap
      

      【讨论】:

        【解决方案4】:

        这也可以:

        (('a' to 'c') zip (1 to 3)).toMap
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 2015-07-10
          • 2014-01-08
          相关资源
          最近更新 更多