2012-03-14 41 views
5

我有隻得到double[][]我想通過int[][]的方法,有沒有在Java中這樣做,東西一樣簡單的一小段路:最短途徑2D雙

int [][] iArray = { 
      { 1, 2, }, 
      { 5, 6, } 
     }; 
double [][] dArray = (double[][]) iArray ; ??? 

回答

18

不幸的是,鑄造你的數組的唯一方法是遍歷每個元素並逐個投射,同時重新插入新的double[][]數組。

沒有捷徑。

+1

你確定... ??? – Lion 2012-03-14 21:28:40

+4

是的。我的來源是我自己對這個主題的研究。 ;)谷歌搜索將帶給你相同的結論。 – Vache 2012-03-14 21:29:40

+0

+1。這是唯一的方法。應對。 – 2012-03-14 22:08:52

0

你不能施放它們,雙打在內存中的排列與整數不同,這不是簡單地改變它們名字的情況。

編輯:只有如果雙是int的超類或亞類,那麼它可能可能是可能的。

+0

這不是一個非常有用的答案。即使佈局相同(即32位),您仍然無法施放它們。 Java類型系統根本不允許它。 – Jochen 2012-03-14 23:58:25

+0

我猜想我想得到的是一個不是另一個的子類,所以鑄造沒有意義。他們32位的事實並不意味着他們的佈局是一樣的。但我明白你的觀點。 – Sandro 2012-03-15 00:51:58

2

不,這是不正確的輸入。 int []是一個類型,double []是一個類型,它們沒有關係,所以這樣的賦值是不允許的。因此,沒有辦法施展這一點。

您將不得不復制元素(您可以將int分配給double而不投射)。

0

你可以這樣說:

int[][] intarray = {{1, 2}, {5, 6}}; 

    double[][] doublearray = new double[intarray.length][intarray[0].length]; 

    for(int i = 0; i < intarray.length; i++) 
    { 
     for(int j = 0; j < intarray[0].length; j++) 
      doublearray[i][j] = (double) intarray[i][j]; 
    } 

編輯:作爲Andreas_D指出,這只是工作,如果所有行都是一樣的lenght的,如果你想變lenght,你必須遍歷第二個用於可變數量列的循環。

+4

這隻適用於所有行具有相同長度的情況。 – 2012-03-14 21:39:59

+0

雖然你不需要做鑄造,所以你可以省略「(雙)」。 @Andreas;是。 – Martin 2012-03-14 21:40:09

0

嗯,我的代碼寫在Java 8值得叫的快捷方式

import java.util.Arrays; 

// ... 

/// Cast! 
int[][] int2DArray = {{3, 1}, {3, 3, 7}, {}}; 
Object[] arrayOfUntypedArraies = Arrays.stream(int2DArray).map(intArray -> Arrays.stream(intArray).asDoubleStream().toArray()).toArray(); 
double[][] double2DArray = Arrays.copyOf(arrayOfUntypedArraies, arrayOfUntypedArraies.length, double[][].class); 

/// Print! 
System.out.println(Arrays.deepToString(int2DArray)); 
// [[1, 2], [5, 6, 7], []] 
System.out.println(Arrays.deepToString(double2DArray)); 
// [[1.0, 2.0], [5.0, 6.0, 7.0], []] 
0

在Java 8,你都可以投射int秒的一維數組的double秒的數組:

double[] singleDimensionDoubleArray = 
     Arrays.stream(singleDimensionIntArray).asDoubleStream().toArray() 

因此,我寫的東西我以爲會被遍歷的是一個速度更快的版本行:

int[][] iArray = { 
    {1, 2,}, 
    {5, 6,} 
}; 

double[][] dArray = new double[iArray.length][]; 
for (int row = 0; row < iArray.length; row++) { 
    dArray[row] = Arrays.stream(iArray[row]).asDoubleStream().toArray(); 
} 

我正要張貼這個答案,但想到我會發布關於如何更快它是天真的每一個元素上循環的一些指標。原來它大約是慢了10倍!我用10000x1000的零陣列對它進行了測試。我想這是額外的對象創造導致放緩。

除非別人可以證明他,我認爲最簡單的解決方案實際上是最快的:

for (int row = 0; row < iArray.length; row++) { 
    for (int column = 0; column < iArray[0].length; column++) { 
     dArray[row][column] = (double) iArray[row][column]; 
    } 
}