[英]Java N-Dimensional Arrays
我需要能夠有一個 n 維字段,其中 n 基於構造函數的輸入。 但我什至不確定這是否可能。 是嗎?
快速解決方案:您可以使用ArrayList
的非泛型ArrayList
來近似它...盡可能深入。 但是,這可能會很快使用起來很尷尬。
需要更多工作的替代方法可能是使用底層平面數組表示來實現您自己的類型,您可以在其中計算內部索引,並提供帶有可變參數的訪問器方法。 我不確定它是否完全可行,但可能值得一試......
粗略的示例(未經測試,沒有溢出檢查,錯誤處理等,但希望傳達基本思想):
class NDimensionalArray {
private Object[] array; // internal representation of the N-dimensional array
private int[] dimensions; // dimensions of the array
private int[] multipliers; // used to calculate the index in the internal array
NDimensionalArray(int... dimensions) {
int arraySize = 1;
multipliers = new int[dimensions.length];
for (int idx = dimensions.length - 1; idx >= 0; idx--) {
multipliers[idx] = arraySize;
arraySize *= dimensions[idx];
}
array = new Object[arraySize];
this.dimensions = dimensions;
}
...
public Object get(int... indices) {
assert indices.length == dimensions.length;
int internalIndex = 0;
for (int idx = 0; idx < indices.length; idx++) {
internalIndex += indices[idx] * multipliers[idx];
}
return array[internalIndex];
}
...
}
這是一篇很好的文章,解釋了如何在運行時使用反射來創建數組: Java Reflection: Arrays 。 那篇文章解釋了如何創建一維數組,但是java.lang.reflect.Array
還包含另一個newInstance
方法來創建多維數組。 例如:
int[] dimensions = { 10, 10, 10 }; // 3-dimensional array, 10 elements per dimension
Object myArray = Array.newInstance(String.class, dimensions); // 3D array of strings
由於直到運行時才知道維數,因此只能將數組作為Object
處理,並且必須使用Array
類的get
和set
方法來操作數組的元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.