【问题标题】:Yield a sequence of tuples instead of map产生一个元组序列而不是映射
【发布时间】:2015-06-12 15:41:56
【问题描述】:

这是我的代码。令我惊讶的是,它产生了一个映射而不是我期望的一个元组序列。在scala中获取元组列表的正确方法是什么?

for ((_, s) <- Constants.sites;
         line <- Source.fromFile(s"data/keywords/topkey$s.txt").getLines
    ) yield ((s, line))

【问题讨论】:

    标签: scala dictionary tuples


    【解决方案1】:

    原因可能是Constants.sitesMap,因此它返回一个地图。

    不是在Constants.sites 上运行推导式,而是在Constants.sites.values 上运行它,反正你只是在使用这些值。

    背景是你的代码被翻译成:

    Constants.sites.flatMap {
      case (_, s) =>
        Source.fromFile(s"data/keywords/topkey$s.txt").getLines.map {
           line =>
             (s, line)
        }
    }
    

    当在Map 上调用flatMap 时,您的结果类型也必须是Map,并且可以将元组强制转换为Map

    编辑:但使用它应该没问题:

    for {
      (_, s) <- Constants.sites
      line <- Source.fromFile(s"data/keywords/topkey$s.txt").getLines
    ) yield ((s, line))
    

    【讨论】:

    • 感谢重构代码。我试了一下,发现 flatMap 仍然没有按我的预期工作。但是,如果我们将 flatMap 更改为 map{}.flatten,那么我们将看到 tuple2s 的 flatten Seq。
    • @HuCao 等一下,更新了我的帖子。 flatMapmap 是 Scala 将 for 脱糖的东西。
    • "原因可能是 Constants.sites 是一个地图,因此它返回一个地图。" +1
    【解决方案2】:

    您可以像这样将任何 Map 转换为 Seq:

    scala> val m = Map(1->"one", 2 -> "two")
    m: scala.collection.immutable.Map[Int,String] = Map(1 -> one, 2 -> two)
    
    scala> m.toSeq
    res0: Seq[(Int, String)] = ArrayBuffer((1,one), (2,two))
    

    在你的情况下,你可能会这样做

    val result = for ((_, s) <- Constants.sites;
             line <- Source.fromFile(s"data/keywords/topkey$s.txt").getLines
        ) yield ((s, line))
    result.toSeq
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2020-10-14
      • 1970-01-01
      • 2021-12-14
      • 2021-06-10
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多