Java N-Dimensional Arrays

后端 未结 3 1396
醉梦人生
醉梦人生 2020-12-06 06:29

I need to be able to have an n-dimensional field where n is based on an input to the constructor. But I\'m not even sure if that\'s possible. Is it?

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-06 07:12

    Quick solution: you could approximate it with a non-generic ArrayList of ArrayList of ... going as deep as you need to. However, this may get awkward to use pretty fast.

    An alternative requiring more work could be to implement your own type using an underlying flat array representation where you calculate the indexing internally, and providing accessor methods with vararg parameters. I am not sure if it is fully workable, but may be worth a try...

    Rough example (not tested, no overflow checking, error handling etc. but hopefully communicates the basic idea):

    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];
      }
      ...
    }
    

提交回复
热议问题