Java, определяющий многомерный массив - PullRequest
0 голосов
/ 11 марта 2012

Я определяю массив следующим образом: int [][] intervals = new int[10][10]; НО Мой массив должен иметь разные измерения, в зависимости от того, кто вызывает функцию, в которой определен этот массив.

Я хотел попробовать сделать что-то вроде этого: int [][] intervals = new int[][];, но там написано "Переменная должна содержать либо выражения измерения, либо инициализатор массива"

Я также пытался int [][] intervals = null, но потом, когда я пытаюсь сделать intervals[3][4] = 10, это дает исключение;

Так, как я могу сделать это?

Ответы [ 3 ]

4 голосов
/ 11 марта 2012

При создании многомерного массива в Java вы должны указать, по крайней мере, размерность самого внешнего массива.В вашем случае, если вы хотите, чтобы все массивы были разного размера, вам все равно нужно будет указать, сколько массивов вам нужно.Например, если вам нужно шесть массивов, вы можете сказать:

int [][] intervals = new int[6][];

Затем вы можете заполнить их так:

intervals[0] = new int[137];
intervals[1] = new int[42];
/* ... */

Если вы не знаете заранее, сколько массивоввам может понадобиться использовать ArrayList<int[]> для явного добавления новых массивов.Например:

ArrayList<int[]> intervals = new ArrayList<int[]>();
intervals.add(new int[137]);
intervals.add(new int[42]);
/* ... */

Надеюсь, это поможет!

3 голосов
/ 11 марта 2012

Попытайтесь представить многомерный массив как массив массивов

Это не совсем так в JVM, но это лучшая ментальная модель для работы с этими видамивопросов.

Итак, если у вас есть

int [][] intervals = null;

, тогда ваш внешний массив равен нулю, и его можно позже инициализировать с помощью

int size = 10;
intervals = new int[size][];

, который создает массив int[], но в этом случае каждый из 10 внутренних массивов равен нулю.

Если вы хотите, чтобы все они были одинакового размера (например, массив 10 x 5), сделайте что-то вроде:

int size1 = 10;
int size2 = 5;
intervals = new int[size1][size2];

Но если вы хотите, чтобы они были разных размеров, сделайте что-нибудьнапример:

int size = 10;
intervals = new int[size][];
intervals[0] = new int[5];
intervals[1] = new int[4];
// etc...

Но все они предполагают, что вы знаете, насколько большим должен быть ваш массив, прежде чем вы начнете его заполнять.
Если вы этого не знаете, то вы хотите использоватьList вместо этого - взгляните на ArrayList.

Edit Я только что видел в вашем комментарии, что вы хотите именно этот последний случай, так что ...

Попробуйте что-то вроде:

List< List<Integer> > list = new ArrayList< List<Integer> >();


for(int i=0; i<10; i++) // You would loop over whatever input you're processing
{                       //  but I don't know what you're doing in that part of you code
                        //  so I'll just do it 10 times.

    List<Integer> innerList = new ArrayList< Integer >();

    innerList.add( 1 );
    innerList.add( 2 );
    innerList.add( 3 );

    // etc.

    list.add( innerList );
}

В качестве альтернативы вы могли бы иметь:

  • List< int[] >, что означало бы использование List для внешней коллекции, но массив длявнутренняя коллекция, если вы знаете, как долго будет ваша внутренняя коллекция.
  • List<Integer>[], который использует массив для внешней коллекции и список для внутренней коллекции.

Это действительно зависит от того, как именно ваш код должен работать.

1 голос
/ 11 марта 2012

Если вы хотите динамически размещать элементы в массиве, возможно, вам следует рассмотреть ArrayList :

ArrayList< ArrayList< int > > array = new ArrayList< ArrayList< int > >();
array.add( new ArrayList< int >() );
array.get( 0 ).add( 1 );
array.get( 0 ).add( 2 );
array.add( new ArrayList< int >() );
array.get( 1 ).add( 3 );
...