2015-06-12 33 views
0

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

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

回答

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

,并呼吁MapflatMap当你的结果类型也需要一个Map,和元组可以被强制转换为Map

编辑:但是使用这个应该是罚款:

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

感谢您重构的代码。我试了一下,发现flatMap仍然没有像我期望的那样工作。但是,如果我们将flatMap更改为map {},那么我们将看到tuple2s的扁平Seq。 –

+0

我会认为它是一个scala技巧 –

+0

@HuCao等,更新了我的帖子。 'flatMap'和'map'的东西就是Scala去掉'for'的东西。 –

0

您可以在任何地图转换成一个序列是这样的:

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 
相关问题