如何在Scala中以算法方式实例化和操作多维数组

时间:2011-11-09 03:50:01

标签: arrays scala multidimensional-array instantiation

我正在尝试编写一个程序来通过Scala Gui来管理数据库,并且在将数据输入表格并填充列标题的方式格式化数据时遇到了很多麻烦。为此,我被告知我需要使用数组[Array [Any]]而不是像我一直使用的ArrayBuffer [ArrayBuffer [String]]。

我的问题是我尝试填充这些数组的方式是模块化的:我试图使用相同的函数从MySQL数据库中的不同表中绘制,每个表都有不同数量的列和条目。 / p>

我能够(我认为)用

定义一个二维数组
val Data = new Array[Array[String]](numColumns)(numRows)

但是我没有找到任何方法来编辑这个新阵列中的单个单元格。

Data(i)(j)=Value  //or
Data(i,j)=Value

不起作用,并向我提供有关“更新”功能的错误

我确信这不可能像我一样复杂,所以用这种语言管理这些东西的简单方法是什么?

4 个答案:

答案 0 :(得分:5)

您不需要将数据读入阵列数组 - 只需将它转换为Table构造器时将其转换为该格式 - 这很容易,这证明了我对你的回答其他问题:How do I configure the Column names in a Scala Table?

如果您正在创建2D数组,那么您想要的成语是

val data = Array.ofDim[String](numColumms, numRows)

(还有new Array[String](numColumns, numRows),但已弃用。)

使用data访问数组data(i)(j)的元素(i,j)(记住它们从0开始)。

但总的来说,你应该避免使用可变集合(如Array,ArrayBuffer),除非有充分的理由。请尝试使用Vector

如果不知道从数据库中检索数据的格式,就无法说明如何将其放入集合中。

更新

您也可以将类型信息放在左侧,因此以下内容相同(根据您的喜好自行决定):

val a: Array[Array[String]] = Array.ofDim(2,2)
val a = Array.ofDim[String](2,2)

解释访问/更新元素的语法:在Java中,多维数组只是一个数组数组。在这里,a(i)是a的元素i,其中Array[String],因此a(i)(j)是该数组的元素j,即String

答案 1 :(得分:3)

Luigi的答案很棒,但我想澄清一下你的代码无效的原因。

val Data = new Array[Array[String]](numColumns)(numRows)

不符合您的预期。 new Array[Array[String]](numColumns)部分确实创建了一个包含numColumns条目的字符串数组数组,所有条目(arrys of strings)都为null,并返回它。以下(numRows)然后只调用返回的对象上的apply函数,该函数返回该列表中的numRows条目,该条目为空。

您可以在scala REPL中尝试:输入

new Array[Array[String]](10)(9)

你得到这个作为输出:

res0: Array[String] = null

Luigi的解决方案,而不是

Array.ofDim[String](2,2)

做正确的事:

res1: Array[Array[String]] = Array(Array(null, null), Array(null, null))

答案 2 :(得分:1)

它相当难看,但您可以使用update更新多维数组

> val data = Array.ofDim[String](2,2)
data: Array[Array[String]] = Array(Array(null, null), Array(null, null))
> data(0).update(0, "foo")
> data
data: Array[Array[String]] = Array(Array(foo, null), Array(null, null))

不确定此技术的效率。

答案 3 :(得分:1)

Luigi的答案很棒,但我只想指出另一种初始化更具惯用性/功能性的数组的方法 - 使用tabulate。这需要一个函数,它将数组单元格坐标作为输入并生成单元格值:

scala> Array.tabulate[String](4, 4) _
res0: (Int, Int) => String => Array[Array[String]] = <function1>

scala> val data = Array.tabulate(4, 4) {case (x, y) => x * y }
data: Array[Array[Int]] = Array(Array(0, 0, 0, 0), Array(0, 1, 2, 3), Array(0, 2, 4, 6), Array(0, 3, 6, 9))