我想一个函数/数据结构,可以这样做:如何声明一个数组,用户可以指定维度?
func(int dim){
if(dim == 1)
int[] array;
else if (dim == 2)
int[][] array;
else if (dim == 3)
int[][][] array;
..
..
.
}
有谁知道怎么样?
我想一个函数/数据结构,可以这样做:如何声明一个数组,用户可以指定维度?
func(int dim){
if(dim == 1)
int[] array;
else if (dim == 2)
int[][] array;
else if (dim == 3)
int[][][] array;
..
..
.
}
有谁知道怎么样?
编辑
或者你可以使用Array.newInstance(int.class, sizes)。尺寸是包含所需尺寸的int[]
。这将更好地工作,因为你可以在结果却强制转换为int[][][]...
原来的答案
您可以使用这一事实,即int[]
和Object[]
是Object
秒。既然你要与列表中给出尺寸矩形多维数组大小
Object createIntArray(List<Integer> sizes) {
if(sizes.size() == 1) {
return new int[sizes.get(0)];
} else {
Object[] objArray = new Object[sizes.get(0)];
for(int i = 0; i < objArray.length; i++) {
objArray[i] = createIntArray(sizes.subList(1, sizes.size());
}
return objArray;
}
}
你失去所有的静态类型检查,但每当你想有一个动态数组的尺寸会发生。
像下面这样的课怎么样?
class DynaArray {
private List<List> repository = new ArrayList<List>();
public DynaArray (int dim) {
for (int i = 0; i < dim; i++) {
repository.add(new ArrayList());
}
}
public List get(int i) {
return repository.get(i);
}
public void resize(int i) {
// resizing array code
}
}
这仍然是一个二维数组,您只是将长度添加到第二维 – nishi 2011-02-09 23:42:27
如果您的目的是创建一个真正动态的数组,那么您应该查看JDK中的Array对象。您可以使用它来动态生成任何维度的数组。下面是一个例子:
public void func(int dim) {
Object array = Array.newInstance(int.class, new int[dim]);
// do something with the array
}
一旦阵列对象已经创建,则可以使用java.lang.reflect.Array中类的方法来访问,添加,从多维数组,这是删除元素创建。还包括实用程序方法来确定数组实例的长度。
可以使用甚至检查数组的尺寸:
public int getDimension(Object array) {
int dimension = 0;
Class cls = array.getClass();
while (cls.isArray()) {
dimension++;
cls = cls.getComponentType();
}
return dimension;
}
人都有交好的解决方案了,但我想如果你换的动态多维数组到这会是很酷(和良好做法)一个类,它可以使用任何数据结构来表示多维数组。我使用散列表,所以你有几乎无限大小的尺寸。
public class MultiDimArray{
private int myDim;
private HashMap myArray;
public MultiDimArray(int dim){
//do param error checking
myDim = dim;
myArray= new HashMap();
}
public Object get(Integer... indexes){
if (indexes.length != myDim){throw new InvalidArgumentException();}
Object obj = myArray;
for (int i = 0; i < myDim; i++){
if(obj == null)
return null;
HashMap asMap = (HashMap)obj;
obj = asMap.get(indexes[i]);
}
return obj;
}
public void set(Object value, Integer... indexes){
if (indexes.length != myDim){throw new InvalidArgumentException();}
HashMap cur = myArray;
for (int i = 0; i < myDim - 1; i++){
HashMap temp = (HashMap)cur.get(indexes[i]);
if (temp == null){
HashMap newDim = new HashMap();
cur.put(indexes[i], newDim);
cur = newDim;
}else{
cur = temp;
}
}
cur.put(indexes[myDim -1], value);
}
}
,你可以使用类是这样的:
Object myObj = new Object();
MultiDimArray array = new MultiDimArray(3);
array.put(myObj, 0, 1, 2);
array.get(0, 1, 2); //returns myObj
array.get(4, 5, 6); //returns null
你有什么打算与这阵呢? – 2011-02-09 23:25:12
我想表现一些因素。 一个因子是m个变量的函数,其中为m个变量的每个值的组合给出一个值。 例如具有2个二进制变量的因子可以用4个方格的表格表示 – nishi 2011-02-09 23:47:19