Java-размерные массивы

Мне нужно иметь n-мерное поле, где n основано на вводе в конструктор. Но я даже не уверен, что это возможно. Это?

3 ответа

Быстрое решение: вы можете приблизиться к нему с помощью универсального ArrayList of ArrayList of..., который будет настолько глубоким, насколько вам нужно. Однако это может стать неудобным для использования довольно быстро.

Альтернативой, требующей больше работы, может быть реализация вашего собственного типа с использованием базового представления плоского массива, в котором вы вычисляете внутреннюю индексацию и предоставляете методы доступа с параметрами 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];
 }
 ...
}


Попробуйте следующее:

https://github.com/adamierymenko/hyperdrive


Вот хорошая статья, в которой объясняется, как использовать отражение для создания массивов во время выполнения: 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, и вы должны использовать методы get и set класса Array для управления элементами массив.

licensed under cc by-sa 3.0 with attribution.