java - 将二维以上的java数组视为列表

标签 java groovy multidimensional-array mop

我正在使用 Groovy 编写处理 BASIC 的 DSL,我希望获得有关如何处理多维(多于 2)维数组的帮助。

我正在处理这样的 BASIC 代码:

100 LET X = A(1, 2, 3)

处理一维的情况很容易——只需创建一个闭包(通过 MOP)返回 A 的元素,而对于二维我可以在表单中做同样的事情

A(2, 3) == A.get(2)[3]

但是我该如何处理无限维度的数组呢?

更新:为了更清楚一点,问题是如何在 DSL 上下文中动态返回数组值?脚本解释器将 A(1, 2, 3) 视为一个函数调用,我可以使用 MOP 拦截它。但是如何在该上下文中返回数组元素的值?

最佳答案

如果您使用嵌套列表建模的 n 维数组(这不是最节省内存的方法,但很容易实现),并且想要访问索引 [i_1, i_2, . .. , i_n] 你可以这样做:

def getElementAt(arr, ... indexes) {
    indexes.inject(arr) { a, ind -> a[ind] }
}

// A 2x2x3 array implemented with nested lists.
def arr = [[[1,1,1], [1,1,5]], [[1,1,1], [1,1,1]]]

// I want to get that 5!
assert getElementAt(arr, 0, 1, 2) == 5

// The line above is equivalent to:
assert arr[0][1][2] == 5

inject允许您迭代集合并从初始值开始累积给定操作的结果。在这种情况下,我们迭代我们想要从数组中获取的索引,并从整个数组开始迭代;然后每次迭代返回给定索引处的子数组,这是将在下一次迭代中使用的值。如果你碰巧用比预期少的索引使用它,它会返回一个列表而不是一个整数,例如getElementAt(arr, 0, 1) == [1, 1, 5]

关于java - 将二维以上的java数组视为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11057860/

相关文章:

scripting - 从 netbeans 运行独立的 groovy 脚本

java - Java8的.map()流操作的Groovy替代方案

带有多维数组的php菜单生成器

java - Sonar-使用 try-with-resources 或在 "Stream"子句 java8 流中关闭此 "finally"

java - SWT 中的 PropertyChangeSupport。如何监听通知,例如在表中?

groovy - 为什么此代码在 Groovy 中警告无法访问?

使用scanf的C多维数组大小

windows - 使用 Windows SDK v7.1 从 Windows 7 上的源代码编译 OpenJDK 6

java - 性能: How are font files usually interacted with?

arrays - MATLAB:如何在没有 for 循环的情况下使用一维向量索引对多维矩阵进行子集化?