【问题标题】:Scala mapping and reducing to an ArrayScala 映射和归约到一个数组
【发布时间】:2014-12-29 05:36:59
【问题描述】:

我的数据有以下格式

{sentenceA1}{tab}{sentenceB1}  
{sentenceA2}{tab}{sentenceB1}  
{sentenceA3}{tab}{sentenceB2}  
{sentenceA4}{tab}{sentenceB2}  

我想使用 Scala 获取与 B 匹配的句子数组

[sentenceA1, sentenceA2]  
[sentenceA3, sentenceA4]

我尝试了以下

val file1 = file.map(line => line.split("\t"))
val file2 = file1.map(line => (line(1), line(0)))
file2.reduceLeft(_+_).collect

但它并不成功

【问题讨论】:

    标签: arrays string scala map reduce


    【解决方案1】:

    你可以这样做:

    list.map(line => line.split("\t")).
        map(a => a(1) -> a(0)).
        groupBy(_._1).
        mapValues(_.map(_._2))
    

    或者

    list.map(line => line.split("\t")).
        groupBy(_(1)).
        mapValues(_.map(_(0)))
    

    你会得到一张地图

    {SentenceB1} -> {sentenceA1, sentenceA2}
    {SentenceB2} -> {sentenceA3, sentenceA4}
    

    【讨论】:

    • 只是一个扩展。如果我想以这种方式进行映射 {SentenceA1} -> {SentenceA2} {SentenceA2} -> {SentenceA1} 等,您有什么建议吗?
    • 如果我理解正确,你想要收集 {sentenceA1 -> sentenceA2} {sentanseA3 -> sentanceA4}。在这种情况下,您可以将 .map({case (k, list) => list(0) -> list(1)}) 添加到任何构造的末尾,但这表明您总是有一对序列。
    • 更具体地说,我想将 sentenceA1 映射到每个有一些共同的 sentenceB 的 sentenceA。
    • 我将它发布在另一个问题中以获得更好的洞察力stackoverflow.com/questions/26701902/…
    【解决方案2】:

    从数据源读取您的行(我使用预定义列表来简化示例):

    val lines = List(
      "sentenceA1\tsentenceB1",
      "sentenceA2\tsentenceB1",
      "sentenceA3\tsentenceB2",
      "sentenceA4\tsentenceB2"
    )
    

    处理每一行:

    • 按制表符分割。
    • 按第二个标记分组
    • 通过跳过第二行标记来简化分组值。

    代码如下:

    val result = lines
      .map(_.split("\t"))
      .groupBy(_(1))
      .mapValues( _.map(_(0)))
    

    【讨论】:

    • 我试过了,我添加了一个 .foreach(println) 来查看输出但没有用
    • 是的,没关系。您可以随心所欲地使用它。
    【解决方案3】:

    同时考虑一个容器类

    case class Text(s:String) {
      val Array(a,b,_*) = s.split("\t") 
    }
    

    分割List[String]中的每个元素;因此

    for ( (k,xs) <- lines.map(Text(_)).groupBy(_.b) ) yield k -> xs.map(_.a) 
    

    提供所需的关联。

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      相关资源
      最近更新 更多