我想一個函數/數據結構,可以這樣做:如何聲明一個數組,用戶可以指定維度?
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