【问题标题】:how would I map a list of strings with a known format to a list of tuples?如何将具有已知格式的字符串列表映射到元组列表?
【发布时间】:2011-02-23 10:47:53
【问题描述】:

我有一个字符串数组。每个字符串有 2 个部分,由空格分隔。看起来像:

 x <white space> y

我想把它变成一个元组数组,其中每个元组都有 (x, y)

我怎样才能在 scala 中写这个?我知道它需要类似于:

val results = listOfStrings.collect { str => (str.left, str.right) }

不确定如何将每个 str 拆分到所需的左侧和右侧...

【问题讨论】:

    标签: scala string functional-programming


    【解决方案1】:

    您可以利用在 Scala 中,正则表达式也是“extractors”这一事实。

    scala> var PairWithSpaces = "(\\w+)\\s+(\\w+)".r                            
    PairWithSpaces: scala.util.matching.Regex = (.+)\s+(.+)
    
    scala> val PairWithSpaces(l, r) = "1     17"
    l: String = 1    
    r: String = 17
    

    现在您可以将提取器构建成看起来自然的“地图”:

    scala> Array("a   b", "1 3", "Z x").map{case PairWithSpaces(x,y) => (x, y) }
    res10: Array[(String, String)] = Array((a,b), (1,3), (Z,x))
    

    也许对你来说有点矫枉过正,但如果你的正则表达式变得花哨,它确实可以提高可读性。如果给出非法字符串,我也喜欢这种方法如何快速失败。

    警告,不确定正则表达式是否完全符合您的需要...

    【讨论】:

      【解决方案2】:

      您可以(假设您想毫无怨言地删除任何不符合该模式的字符串):

      val results = listOfStrings.map(_.split("\\s+")).collect { case Array(l,r) => (l,r) }
      

      【讨论】:

      • 包括 view 以节省潜在的运行时间。
      • @Raphael - 在listOfStringsmap 之间,是的,可能。但鉴于split 生成一个正则表达式、一个数组和至少一个字符串,我认为它不会那么明显。一个额外的:: 对象可能并不那么重要。
      • 他们我理解view,许多由此创建的拆分结果将永远不会写入堆(即那些被过滤掉的),而它们却没有view。不过,我不能说影响是什么。
      • 我认为这里发生的事情的复杂性太大了,即使-XX:+DoEscapeAnalysis 也无法简化,所以事情放在了堆上。但是它们将位于堆中最年轻的区域,并且不会长时间存活,因此如果有大量数据,它可能会对垃圾收集产生影响。但是,对于任何不接近整个内存大小的东西,这都无关紧要。分裂产生的对象会一个一个或一个全部出现在堆上,最终会被清空。
      猜你喜欢
      • 1970-01-01
      • 2016-07-31
      • 2018-08-06
      • 1970-01-01
      • 2015-07-14
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多