Java N-мерные массивы
Мне нужно иметь n-мерное поле, где n основано на входе в конструктор. Но я даже не уверен, возможно ли это. Это?
3 ответа
Быстрое решение: вы можете приблизить его с не универсальным ArrayList
из ArrayList
из... идти так глубоко, как вам нужно. Тем не менее, это может быть неудобно использовать довольно быстро.
Альтернативой, требующей дополнительной работы, может быть реализация собственного типа с использованием базового представления плоского массива, в котором вы рассчитываете внутреннее индексирование, и предоставление методов доступа с параметрами vararg. Я не уверен, что это полностью работоспособно, но, возможно, стоит попробовать...
Грубый пример (не проверенный, без проверки переполнения, обработки ошибок и т. Д., Но, мы надеемся, передает основную идею):
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: Массивы. В этой статье объясняется, как создать одномерный массив, но 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
и вы должны использовать get
а также set
методы Array
класс для работы с элементами массива.