arrays - 从 Scala 中的 for 循环生成 ArrayBuffer(或其他可变 Collection 类型)

标签 arrays scala collections mutable

在处理大型多维数组的单个矩阵相关方法的范围内,性能和内存使用至关重要。我们需要就地改变数组的元素,因此正在使用 ArrayBuffer(而不是 Array)。

考虑到这个用例,有没有一种方法可以使用 ..yield 来生成 ArrayBuffer(或至少是可变集合)而不是不可变的?

以下代码显示了意图 - 尽管它无法编译:

def classify(inarr: Array[Double], arrarr: Array[Array[Double]], labels: Array[String], K: Int): String = {
 ...     
var diffmat: ArrayBuffer[ArrayBuffer[Double]] = for (row <- arrarr) yield {
  (ArrayBuffer[Double]() /: (row zip inarr)) {
    (outrow, cell) => outrow += cell._1 - cell._2
  }
}

编译错误是:

Expression Array[ArrayBuffer[Double]] does not conform to expected type ArrayBuffer[ArrayBuffer[Double]]

最佳答案

啊...突破的“魔法洒水”案例。它不仅可以为您提供所需的集合类型,而且可以高效地完成此操作,而不会浪费额外的转换。

object Foo {
  import scala.collection.mutable.ArrayBuffer
  import scala.collection.breakOut
  val inarr: Array[Double] = Array()
  val arrarr: Array[Array[Double]] = Array()

  var diffmat: ArrayBuffer[ArrayBuffer[Double]] = (for (row <- arrarr) yield {
    (ArrayBuffer[Double]() /: (row zip inarr)) {
      (outrow, cell) => outrow += cell._1 - cell._2
    }
  })(breakOut)
}

最终的文章(恕我直言)是 Daniel Sobral's answer .

关于arrays - 从 Scala 中的 for 循环生成 ArrayBuffer(或其他可变 Collection 类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228122/

相关文章:

php - 当文本像数组时如何将字符串转换为数组

Scala案例类更新值

scala - 即使没有匹配项,如何始终在接收()中调用方法

java - 如何在java中创建不可变列表?

c# - 将表列中的二进制读入 byte[] 数组

javascript - 在javascript中计算其范围内的年龄

java - 使用 Java 将字符串原子追加到 Windows 中的文件

java - 防止重复但保留可逆重复插入顺序的集合?

java - 将文本文件分成 block

javascript - renameFiles - 获取文件名数组并根据它们在数组中出现的次数重命名它们