Как вы объявляете массив, где пользователь может указать размерность? - PullRequest
2 голосов
/ 10 февраля 2011

Мне нужна функция / структура данных, которая может сделать это:

func(int dim){

if(dim == 1)

int[] array;

else if (dim == 2)

int[][] array;

else if (dim == 3)

int[][][] array;

..

..

.

}

кто-нибудь знает как?

Ответы [ 4 ]

4 голосов
/ 10 февраля 2011

Редактировать

Или вы можете использовать Array.newInstance (int.class, размеры) .Где размеры int[], содержащие желаемые размеры.Это будет работать лучше, потому что вы могли бы на самом деле привести результат к int[][][]...


Оригинальный ответ

Вы можете использовать тот факт, что int[] и Object[] равны Object s.Учитывая, что вам нужен прямоугольный многомерный массив с размерами, заданными размерами списка

Object createIntArray(List<Integer> sizes) {
    if(sizes.size() == 1) {
        return new int[sizes.get(0)];
    } else {
        Object[] objArray = new Object[sizes.get(0)];
        for(int i = 0; i < objArray.length; i++) {
           objArray[i] = createIntArray(sizes.subList(1, sizes.size());
        }
        return objArray;
    }
}

Вы потеряете всю статическую проверку типов, но это произойдет, когда вы захотите динамически размерный массив.

1 голос
/ 10 февраля 2011

У людей уже есть хорошие решения, но я подумал, что было бы здорово (и хорошая практика), если вы поместите динамический многомерный массив в класс, который может использовать любую структуру данных для представления многомерного массива. Я использую хеш-таблицу, чтобы у вас были практически неограниченные размеры.

public class MultiDimArray{
  private int myDim;
  private HashMap myArray;

  public MultiDimArray(int dim){
     //do param error checking 
     myDim = dim;
     myArray= new HashMap();
  }

  public Object get(Integer... indexes){
     if (indexes.length != myDim){throw new InvalidArgumentException();}

     Object obj = myArray;
     for (int i = 0; i < myDim; i++){
       if(obj == null)
         return null;

         HashMap asMap = (HashMap)obj;
         obj = asMap.get(indexes[i]);
     }

     return obj;
  }

  public void set(Object value, Integer... indexes){
    if (indexes.length != myDim){throw new InvalidArgumentException();}
      HashMap cur = myArray;
      for (int i = 0; i < myDim - 1; i++){
        HashMap temp = (HashMap)cur.get(indexes[i]);
        if (temp == null){
          HashMap newDim = new HashMap();
          cur.put(indexes[i], newDim);
          cur = newDim;
        }else{
          cur = temp;
        }
     }
     cur.put(indexes[myDim -1], value);
  }
}

и вы можете использовать класс следующим образом:

Object myObj = new Object();
MultiDimArray array = new MultiDimArray(3);
array.put(myObj, 0, 1, 2); 
array.get(0, 1, 2); //returns myObj
array.get(4, 5, 6); //returns null
1 голос
/ 10 февраля 2011

Если ваша цель - создать действительно динамический массив, вам следует взглянуть на объект Array в JDK.Вы можете использовать это, чтобы динамически генерировать массив любого измерения.Вот пример:

    public void func(int dim) {
        Object array = Array.newInstance(int.class, new int[dim]);
        // do something with the array        
    }

После создания массива Object вы можете использовать методы класса java.lang.reflect.Array для доступа, добавления, удаления элементов из многомерного массиваэто было создано.В него также входят служебные методы для определения длины экземпляра массива.

Вы даже можете проверить размерность массива, используя:

public int getDimension(Object array) {
    int dimension = 0;
    Class cls = array.getClass();
    while (cls.isArray()) {
        dimension++;
        cls = cls.getComponentType();
    }
    return dimension;
}
0 голосов
/ 10 февраля 2011

Как насчет класса, подобного следующему?

class DynaArray {

private List<List> repository = new ArrayList<List>();

public DynaArray (int dim) {
for (int i = 0; i < dim; i++) {
     repository.add(new ArrayList());
}
}

public List get(int i) {
return repository.get(i);
}

public void resize(int i) {
 // resizing array code
}

}
...