2011-02-09 74 views
2

我想一個函數/數據結構,可以這樣做:如何聲明一個數組,用戶可以指定維度?

func(int dim){ 

if(dim == 1) 

int[] array; 

else if (dim == 2) 

int[][] array; 

else if (dim == 3) 

int[][][] array; 

.. 

.. 

. 

} 

有誰知道怎麼樣?

+1

你有什麼打算與這陣呢? – 2011-02-09 23:25:12

+0

我想表現一些因素。 一個因子是m個變量的函數,其中爲m個變量的每個值的組合給出一個值。 例如具有2個二進制變量的因子可以用4個方格的表格表示 – nishi 2011-02-09 23:47:19

回答

4

編輯

或者你可以使用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; 
    } 
} 

你失去所有的靜態類型檢查,但每當你想有一個動態數組的尺寸會發生。

0

像下面這樣的課怎麼樣?

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 
} 

} 
+0

這仍然是一個二維數組,您只是將長度添加到第二維 – nishi 2011-02-09 23:42:27

1

如果您的目的是創建一個真正動態的數組,那麼您應該查看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; 
}
1

人都有交好的解決方案了,但我想如果你換的動態多維數組到這會是很酷(和良好做法)一個類,它可以使用任何數據結構來表示多維數組。我使用散列表,所以你有幾乎無限大小的尺寸。

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 
相關問題