2013-07-10 53 views
2

我有一個包含數組的字符串。例如:運行時在Java中創建一個n維的數組

"[[1, 2], [4, 5], [7, 8]]" 

現在,我想創建一個實際的Java數組。我創建了一個函數來獲取維度和一個遞歸函數來獲取數組的每個元素。因此,我創建了每個1-D數組,但是我想知道在Java中是否有方法創建在運行時發現的維數組?維度作爲數組返回。就像,上面例子中的尺寸爲:

[3, 2] 

編輯: 有沒有一種方法來創建這個信息的實際的數組?尺寸[3,2]只是一個例子。我也可以有[3,2,4,5]。運行期間可以從這些信息生成一個數組嗎?編譯期間我沒有這些信息。

有一些問題,我無法評論答案。所以,我在這裏編輯。

+1

爲什麼不使用列表? –

+0

你用新創建的數組做什麼? – vels4j

+1

總是有兩個維度嗎?或者它可以是「[[1,2],[3,4]] [[5,6],[7,8]] [[9,10]]」 –

回答

1

主要問題是你不能直接在代碼中引用N維數組。

幸好Java有一個有點骯髒的黑客,可以讓你有一些方式有N維數組工作:

數組是像Java中所有其他非靈長類動物的對象。

因此你可以有:

// Note it's Object o not Object[] o 
Object o = new Object [dimensionLengh]; 

您可以使用遞歸方法來構建它。

Object createMultyDimArray(int [] dimensionLengths) { 
    return createMultyDimArray(dimensionLengths, 0); 
} 

Object createMultyDimArray(int [] dimensionLengths, int depth) { 
    Object [] dimension = new Object[dimensionLengths[depth]]; 
    if (depth + 1 < dimensionLengths.length) { 
     for (int i=0; i < dimensionLengths[depth]; i++) { 
      dimension[i] = createMultyDimArray(dimensionLengths, depth+1); 
     } 
    } 
    return dimension; 
} 

要使用這一點,你需要轉換從ObjectObject []

Java在數組中類型安全,錯誤可能導致ClassCastException。我建議你也閱讀一下如何使用java反射來創建數組:http://docs.oracle.com/javase/tutorial/reflect/special/arrayInstance.html

+0

我在這一行中得到了一個StackOverflow錯誤:dimension [i] = createMultyDimArray(dimensionLengths,depth);當用參數'new int [] {2,3,4,5}' –

+0

調用它時,我認爲你忘記了增加深度(你可能想用我在行中) –

2

如果你在做數字工作,那麼你應該使用一個庫。例如,我的開源庫Vectorz爲多維數組/矩陣提供了適當的支持(使用double s)。

然後,你可以這樣做:

INDArray m=Arrayz.parse("[[1, 2], [4, 5], [7, 8]]"); 

的INDArray對象封裝所有的多面性,所以你不必擔心寫大嵌套循環所有的時間,再加上它提供了很多其他的普通Java數組沒有的功能和功能。

+0

不錯的鏈接。如果是,你應該說明它是你的圖書館。 (鏈接似乎如此) –