【问题标题】:Scala: how to transform sequence of strings into a sequence of tuples by splitting stringsScala:如何通过拆分字符串将字符串序列转换为元组序列
【发布时间】:2018-06-12 20:33:28
【问题描述】:

我正在尝试像下面这样转换一个序列

val raw: Seq[String] = Seq("timmy barns", "jimmy smith", "mark middle")

进入一个看起来像这样的序列。

val parsed: Seq[(String, String)] = Seq(("timmy", "barns"), ("jimmy", "smith"), ("mark", "middle"))

我能想到的最好的就是这样。

val parsed: Seq[(String, String)] = Seq(raw.map(i => i.split(" ")))

显然这行不通,谁能给我建议?

【问题讨论】:

    标签: string scala sequences


    【解决方案1】:

    这将优雅地但无声地将所有不split() 的输入放入 2 个元素中。

    raw.map(_.split("\\s+")).collect{case Array(a,b) => (a,b)}
    

    【讨论】:

      【解决方案2】:

      如果你想将它与更通用的正则表达式匹配结合起来,这个变体可能更可取:

      val P = "(\\w+) +(\\w+)".r 
      val result = for (P(x, y) <- raw) yield (x, y)
      

      给予:

      result: Seq[(String, String)] = List((timmy,barns), (jimmy,smith), (mark,middle))
      

      【讨论】:

      • \\w+ 可能不适用于“tim berners-lee”之类的名称。也许是\\S+
      • @LeoC 好吧,是的...但是对于“Saunders Mac Lane”,即使\\S+ 也无法正常工作。正则表达式解决方案的优势(与split 相比)是具有更多的灵活性,例如,可以允许姓氏中的符号更多。
      【解决方案3】:

      可能是这样的:-

      val raw: Seq[String] = Seq("timmy barns", "jimmy smith", "mark middle")
      
      val splitRaw = raw.map { x =>
        (x.split(" ").head, x.split(" ").last)
      }
      

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        我的版本)

        raw.map(_.split(" ") match {
            case Array(a, b) => (a, b)
        })
        

        【讨论】:

          猜你喜欢
          • 2013-02-04
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          • 1970-01-01
          • 1970-01-01
          • 2020-08-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多