2014-03-26 207 views
0

用C/C++,能夠執行以下操作:複製1D陣列2D陣列

int arr[100]; 
int ar[10][10]; 
memcpy(ar, arr, sizeof(int)*100); 

由於C/C++標準保證陣列是連續的,上述將一維數組複製到2D陣列。

這在Java中可能嗎?

+0

不,你必須循環。如果有的話,Java保證100是連續的,但10x10不是。 Java的int [] []實際上是c的int **,而不是int [] []。 – Kevin

+0

你有沒有嘗試java.lang.System.arraycopy? http://www.tutorialspoint.com/java/lang/system_arraycopy.htm – Brent

+0

對於Java 7,而不是'System.arraycopy',你可以使用'java.util.Arrays.copyOfRange(...)'。這不會創建多維數組,但可以在循環中使用它。 – aliteralmind

回答

2

這在Java中不可行,因爲Java中的多維數組實際上是一個數組數組。元素不存儲在連續的內存塊中。您將需要逐行復制元素。

例如,這裏有幾種可能的方法之一:

int arr[100] = . . .; 
int ar[10][10] = new int[10][10]; 
int offset = 0; 
for (int[] row : ar) { 
    System.arraycopy(arr, offset, row, 0, row.length); 
    offset += row.length; 
} 

Java Language Specification, §15.10.1,這裏有評估數組創建表達式new int[10][10](尤其是最後一點注)時發生的步驟:

  • 首先,從左到右評估維度表達式。如果任何表達式評估突然完成,則不會評估其右側的表達式。

  • 接下來,檢查維度表達式的值。如果任何DimExpr表達式的值小於零,則拋出NegativeArraySizeException。

  • 接下來,空間分配給新陣列。如果沒有足夠的空間分配數組,則通過拋出OutOfMemoryError突然完成數組創建表達式的求值。

  • 然後,如果出現一個DimExpr,將創建一個指定長度的一維數組,並將該數組的每個組件初始化爲默認值(§4.12.5)。否則,如果出現n個DimExpr表達式,則數組創建將有效地執行一組深度爲n-1的嵌套循環,以創建隱含的數組數組。