将嵌套的ArrayBuffer转换为scala中的嵌套数组

时间:2017-06-14 13:03:25

标签: scala

有没有办法将嵌套的arrayBuffer转换为scala中的嵌套数组?我尝试使用toArray函数,但它没有转换嵌套的arrayBuffers

我有一个Any类型的数组缓冲区,以下是我的样本嵌套

ArrayBuffer(
ArrayBuffer(ArrayBuffer(ArrayBuffer(1, b), 5)))

2 个答案:

答案 0 :(得分:1)

以下代码适用于您的特定测试用例。它会转换嵌套的ArrayBuffer,它们是封闭ArrayBuffer的第一个元素:

def convert(a: Any): Array[Any] = a match {
  case ArrayBuffer(inner @ ArrayBuffer(_*)) => Array(convert(inner))
  case ArrayBuffer(head @ ArrayBuffer(_*), tail @ _*) => (convert(head) +: tail).toArray
  case arr @ ArrayBuffer(_*) => arr.toArray
}

val result = convert(ArrayBuffer(ArrayBuffer(ArrayBuffer(ArrayBuffer(1, "b"), 5))))
// result is Array(Array(Array(Array(1, "b"), 5)))

也许以上内容可以帮助您找到更通用的解决方案。

答案 1 :(得分:0)

我创建了一个将arraybuffer转换为array的泛型函数。这也处理嵌套的arrayBuffers

def convert(a: ArrayBuffer[Any]): Array[Any] = {

  val checkExistance = (x:ArrayBuffer[Any]) => x.zipWithIndex.collect{ case(x,y) if x.isInstanceOf[ArrayBuffer[Any]] => y}.toArray
  //filter(x => x.isInstanceOf[ArrayBuffer[Any]])
  val arr = checkExistance(a)
  for(i <- arr) {
    //if (a(i).isInstanceOf[ArrayBuffer[Any]]) {
    val m = a(i).asInstanceOf[ArrayBuffer[Any]]
    if(checkExistance(m).length > 0) {
      a.update(i,(convert(m)).toArray)
    }
    else {
      val n = m.toArray
      a.update(i,n)
    }
  }
  a.toArray
}