寻找一种分裂阵列的好方法

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中肯定有一些东西我不见了.任何的想法?

谢谢,鲁本

kir*_*uku 0

我不知道任何内置方法,但我想出了一个比你的更简单的方法:

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)