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)