Java N-мерные массивы - PullRequest
       29

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

9 голосов
/ 23 января 2011

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

Ответы [ 3 ]

8 голосов
/ 23 января 2011

Быстрое решение: вы можете аппроксимировать его нехарактерным 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];
  }
  ...
}
3 голосов
/ 23 марта 2011

Попробуйте это:

https://github.com/adamierymenko/hyperdrive

3 голосов
/ 23 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...