我正在使用 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/