在满足谓词的每个元素上拆分列表(Scala)

Lui*_*hys 12 collections scala list

在文本文件中,我有以下形式的数据:

1)
text
text
2)
more text
3)
even more text
more even text
even more text
...
Run Code Online (Sandbox Code Playgroud)

我使用以下内容将其作为字符串列表阅读:

val input = io.Source.fromFile("filename.txt").getLines().toList
Run Code Online (Sandbox Code Playgroud)

我想打破列表分解成子列表开始1),2)等等.

我想出来:

val subLists =
  input.foldRight( List(List[String]()) ) {
    (x, acc) =>
      if (x.matches("""[0-9]+\)""")) List() :: (x :: acc.head) :: acc.tail
      else (x :: acc.head) :: acc.tail
  }.tail
Run Code Online (Sandbox Code Playgroud)

这可以更简单地实现吗?如果有一个内置方法可以在满足谓词的每个元素上拆分集合(提示,提示,库设计者:)),那将会是非常好的.

Mar*_*sky 24

foldRight使用复杂的参数通常表明您可以使用递归来编写此函数,并将其分解为自己的方法,而您可以使用递归.这就是我想出来的.首先,让我们概括为泛型方法groupPrefix:

 /** Returns shortest possible list of lists xss such that
  *   - xss.flatten == xs
  *   - No sublist in xss contains an element matching p in its tail
  */
 def groupPrefix[T](xs: List[T])(p: T => Boolean): List[List[T]] = xs match {
   case List() => List()
   case x :: xs1 => 
     val (ys, zs) = xs1 span (!p(_))
     (x :: ys) :: groupPrefix(zs)(p)  
 }
Run Code Online (Sandbox Code Playgroud)

现在只需通过调用即可获得结果

 groupPrefix(input)(_ matches """\d+\)""")
Run Code Online (Sandbox Code Playgroud)