2014-06-27 80 views
6

假設我們有多維數組,並且只在運行時才知道維數。假設我們有一個整數指數。如何以編程方式在Java中訪問多維數組?

如何申請指數數組所以要訪問數組的元素?

UPDATE

假設:

int [] indices = new int { 2, 7, 3, ... , 4}; // indices of some element 
int X = indices.length; // number of dimensions 
Object array = .... // multidimensional array with number of dimensions X 

... 

我想獲取從array通過指數indices解決的元素。

更新2

我寫了一個基於遞歸下面的代碼:

package tests; 

import java.util.Arrays; 

public class Try_Multidimensional { 

    private static int element; 

    public static int[] tail(int[] indices) { 
     return Arrays.copyOfRange(indices, 1, indices.length); 
    } 


    public static Object[] createArray(int ... sizes) { 

     Object[] ans = new Object[sizes[0]]; 

     if(sizes.length == 1) { 
      for(int i=0; i<ans.length; ++i) { 
       ans[i] = element++; 
      } 
     } 

     else { 
      for(int i=0; i<ans.length; ++i) { 
       ans[i] = createArray(tail(sizes)); 
      } 
     } 

     return ans; 

    } 

    public static Object accessElement(Object object, int ... indices) { 

     if(object instanceof Object[]) { 

      Object[] array = (Object[]) object; 

      return accessElement(array[indices[0]], tail(indices)); 

     } 

     else { 
      return object; 
     } 

    } 

    public static void main(String[] args) { 

     element = 0; 
     Object array = createArray(4, 5, 12, 7); 

     System.out.println(accessElement(array, 0, 0, 0, 0)); 
     System.out.println(accessElement(array, 0, 0, 0, 1)); 
     System.out.println(accessElement(array, 1, 0, 10, 0)); 
     try { 
      System.out.println(accessElement(array, 0, 5, 0, 1)); 
     } 
     catch(Exception e) { 
      System.out.println(e.toString()); 
     } 

    System.out.println(4*5*12*7-1); 
    System.out.println(accessElement(array, 3, 4, 11, 6)); 

    } 

} 

的問題是:

1)是否有從JDK和/或任何可靠的現成方法這個着名的圖書館?

2)I用Object。可以避免嗎?我可以創建/訪問內置或特定類型的變量維度數組嗎?由於使用Object而獲得多少回報?

+4

你能成爲一個更具體一點請,也許提供了一個代碼snipplet? – TimStefanHauschildt

+0

您能否提供任何示例。瞭解 – Kick

+0

我建議您閱讀[this](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/array.html)。 – Djon

回答

2
int index(Object arrayToIndex, int... indices) { 
    for (int i = 0; i < indices.length - 1; i++) { 
     arrayToIndex = ((Object[]) arrayToIndex)[indices[i]]; 
    } 
    return ((int[]) arrayToIndex)[indices[indices.length-1]]; 
} 

循環遍歷維度並索引每個維度,一次一個。最後一個維度的投射和特殊情況會很煩人,所以我建議將它包裝在某種n維數組類中。 (It looks like some options already exist.

+0

我想她想創建一個具有N維的數組,其中N直到運行時才知道,這是語言不支持的。 –

+0

@JeffScottBrown:這個問題剛剛討論訪問數組。創建它是另一回事。 – user2357112

+0

我以同樣的方式誤解了這個問題。這個問題包括「Object array = .... //維數爲X的多維數組」,這是右邊那個不能完成的事情。您不能創建具有動態維數的數組,這正是我認爲她所追求的。也許我錯了,她在追求什麼。 –

0

你可以發現每一個維度作爲單獨的數組的大小(因爲這是他們所):

public void someMEthod(int[][][] matrix) { 
    int d1 = matrix.length; 
    int d2 = 0; 
    int d3 = 0; 
    if(d1 > 0) { 
     d2 = matrix[0].length; 
     if(d2 > 0) { 
      d3 = matrix[0][0].length; 
     } 
    } 
    System.out.println("Dimension 1 is " + d1); 
    System.out.println("Dimension 2 is " + d2); 
    System.out.println("Dimension 3 is " + d3); 
} 

我希望幫助。

+0

的維數是變量,而不僅僅是每個維度的大小。 – user2357112

+0

我想這裏的問題是數組有一個未知數量的維度,所以'matrix'不能被任意地聲明爲'int [] [] []'。 –

+0

原始問題已被編輯,以至於我不確定這是否真的回答了這個問題。目前編寫的問題的答案是,你不能那樣做。在聲明數組時,必須知道維數。每個維度的值可以是運行時動態的,但不是維度的數量。 –

0

我發現了一個還挺有趣的方式使用反射來做到這一點。這只是我扔在一起的一些代碼,但是你可以將它包裝在一個類中,並且使它變得非常漂亮。

// build and fill an array to the given depth 
public static Object[] constructArray(Object[] array, int depth) { 
    if(depth == 0) 
     return null; 

    for(int i=0;i<array.length;i++) { 
     Array.set(array, i, constructArray(new Object[array.length], depth-1)); 
    } 
    return array; 
} 

// sets a value in the multi dimensional array using the indicies 
public static void setArrayUsingIndecies(Object array, int[] indicies, Object value) { 
    if(indicies.length == 0) 
     return; 

    for(int i=0;i<indicies.length-1;i++) { 
     array = Array.get(array, indicies[i]); 
    } 

    Array.set(array, indicies[indicies.length-1], value); 
} 

// gets a value in the multi dimmensional array using the indicies 
public static Object getArrayUsingIndecies(Object array, int[] indicies) { 

    Object value = array; 
    for(int i=0;i<indicies.length;i++) { 
     value = Array.get(value, indicies[i]); 
    } 

    return value; 
} 

繼承人位的示例代碼

int numberOfDimmensions = 2; 

Object array = constructArray(new Object[numberOfDimmensions], numberOfDimmensions); 

int [] indices = new int [] { 0, 1 }; 
setArrayUsingIndecies(array, indices, "Hello"); 
System.out.println(getArrayUsingIndecies(array, indices)); // Hello 
indices = new int [] { 0, 0 }; 
System.out.println(getArrayUsingIndecies(array, indices)); // null 
0

它比我們想象的更簡單嗎?如何對這種做法:

int [] indices = new int { 2, 7, 3, ... , 4}; // indices of some element 
int X = indices.length; // number of dimensions 
Object array = new Object[X].... // multidimensional array with number of dimensions X 

然後:

Object myObject = array[indices[1]] // myObject references the 7th element of array 

你必須確保雖然,你的索引數組不包含大的號碼,然後指數的大小 - 1。例如

indices = new int [5,4,3,2,1] // ok 
indices = new int [6,4,3,2,1] // not ok, because you would access the 6th Element in an arry with length 5 
+0

這不是來自'C#'嗎? –

+0

對不起,我不理解你的評論? – TimStefanHauschildt