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 класс для работы с элементами массива.

Другие вопросы по тегам