在运行时设置数组的等级

我想知道最简单的方法是实现一个在运行时指定排名的数组。

我正在处理的示例存储了格点的布尔值数组,我希望用户能够选择模型在运行时使用的空间维数。

我查看了Array.newInstance()方法:

dimensionOfSpace = userInputValue; // this value comes from GUI or whatever int latticeLength = 5; // square lattice for simplicity int[] dimensions = new int[dimensionOfSpace]; for(int i = 0; i < l.length; i++) l[i] = length; Object lattice = Array.newInstance(boolean.class, dimensions); 

但是以任何方式访问这些值似乎都需要非常慢的方法,例如递归使用Array.get,直到返回的值不再是数组,即使用isArray()。

我在这里错过了一个明显的解决方案 我希望能够以类似于foo [i] [j] [k]的方式访问这些值。

看起来你正在寻找的是某种方式来声明一个数组在运行时有多少维度。 我不知道如何使用多维ArrayList或任何多维结构来完成此操作,您必须在编译时指定维度。

我看到的唯一答案是使用一个包含在类中的简单线性数组,该数组将多维坐标转换为其在底层数组中的位置。 这基本上是C语言如何通过使用一个连续的内存块来存储多维数组。

代码看起来像这样:

 import java.util.*; class MultiArray{ private int[] dimensions; private Object[] array; public MultiArray(int ... dimensions){ this.dimensions=dimensions; //Utils.product returns the product of the ints in an array array=new Object[Utils.product(dimensions)]; } public void set(T value, int ... coords){ int pos=computePos(coords); array[pos]=value; } public T get(int ... coords){ int pos=computePos(coords); return (T)(array[pos]); } private int computePos(int[] coords){ int pos=0; int factor=1; for (int i=0;i m=new MultiArray(new int[]{5,4,3}); Random r=new Random(); for(int i=0;i<5;i++) for(int j=0;j<4;j++) for(int k=0;k<3;k++) m.set(r.nextInt(),i,j,k); for(int i=0;i<5;i++){ for(int j=0;j<4;j++){ for(int k=0;k<3;k++) System.out.print(m.get(i,j,k)+" "); System.out.println(""); } System.out.println("\n"); } } } class Utils{ public static int product(int...a){ int ret=1; for (int x:a) ret*=x; return ret; } } 

Checkout Java Collections 。 它包含一个名为ArrayList的类,它根据需要增大。

一维

List a = new ArrayList();

二维

List> b = new List>();

三维

List>> c = new List>>();

并且您将以c.get(i).get(j).get(k)而不是c[i][j][k]forms访问该项目,如同在3d数组中一样。 或者甚至更好,将它包装在您自己的类中,并在get()使用get()方法。 所以它变成了:

c.get(i, j, k) ;

编辑

要获得深度为N的多维列表,请删除Boolean类型指示符,并将列表创建为

 List level1 = new ArrayList(); List level2 = new ArrayList(); List level3 = new ArrayList(); level1.add(level2); level2.add(level3); 

等等..

我将使用术语“rank”来表示数组中的“维数”。 因此,向量具有等级1,矩阵具有等级2,依此类推。 你已经接受了一个答案,你自己承认并不是你想要的。 这是另一种解决方案:

回想一下,计算机内存本质上是线性的,编译器在为数组提供数据时所做的事实上是将索引表达式转换为线性地址。 如果您假设所有数组都在连续内存中,这是最简单的考虑,并非总是如此。 假设你做了一个声明,如ARRAY_OF_TYPE [10] [10] [10],即它有1000个元素。 然后,在位置baseAddress + 354 * size_of_element_of_TYPE处,位置[3] [5] [4]处的元素是(我的数组从1开始索引而不是0 – 根据需要更改后面的总和)。

我希望你现在知道我要去哪里…

在运行时,程序会提示用户输入整数列表。 每个整数指定数组的一个维度的大小,整数的数量指定数组的等级。 你的程序进行一些乘法,你分配一个正确长度的向量。 好的,你必须编写索引和去索引函数,但这些应该相当简单。

et voila你有一个数组,其排名是在运行时建立的。

我做了一个快速的谷歌搜索“Java张量”,它提出了DJEP ,这可能适合你的账单吗?