Rub*_*ben 13 arrays string split scala
我一直在寻找类似于Scala 数组中String.split的方法,但我找不到它.
我想要做的是通过分隔符拆分数组.
例如,分隔以下数组:
val array = Array('a', 'b', '\n', 'c', 'd', 'e', '\n', 'g', '\n')
Run Code Online (Sandbox Code Playgroud)
使用'\n'分隔符,应该导致:
List(Array(a, b), Array(c, d, e), Array(g))
Run Code Online (Sandbox Code Playgroud)
我知道我可以将Array转换为String,并在那里应用split:
array.mkString.split('\n').map(_.toArray)
Run Code Online (Sandbox Code Playgroud)
但我宁愿跳过转换.
到目前为止我的解决方案涉及递归使用span,并且有点过于样板:
def splitArray[T](array: Array[T], separator: T): List[Array[T]] = {
def spanRec(array: Array[T], aggResult: List[Array[T]]): List[Array[T]] = {
val (firstElement, restOfArray) = array.span(_ != separator)
if (firstElement.isEmpty) aggResult
else spanRec(restOfArray.dropWhile(_ == separator), firstElement :: aggResult)
}
spanRec(array, List()).reverse
}
Run Code Online (Sandbox Code Playgroud)
我确信Scala中肯定有一些东西我不见了.任何的想法?
谢谢,鲁本
我不知道任何内置方法,但我想出了一个比你的更简单的方法:
def splitOn[A](xs: List[A])(p: A => Boolean): List[List[A]] = xs match {
case Nil => Nil
case x :: xs =>
val (ys, zs) = xs span (!p(_))
(x :: ys) :: splitOn(zs.tail)(p)
}
// for Array
def splitOn[A : reflect.ClassTag](xs: Array[A])(p: A => Boolean): List[Array[A]] =
if (xs.isEmpty) List()
else {
val (ys, zs) = xs.tail span (!p(_))
(xs.head +: ys) :: splitOn(zs.tail)(p)
}
scala> val xs = List('a', 'b', '\n', 'c', 'd', 'e', '\n', 'g', '\n')
xs: List[Char] =
List(a, b,
, c, d, e,
, g,
)
scala> splitOn(xs)(_ == '\n')
res7: List[List[Char]] = List(List(a, b), List(c, d, e), List(g))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8947 次 |
| 最近记录: |