2D динамический массив с использованием ArrayList в Java - PullRequest
4 голосов
/ 04 июня 2011

Мне нужно реализовать двумерный динамический массив.Количество строк фиксировано, скажем, n.Но количество столбцов для каждой строки не является фиксированным и эквивалентным.Например, первая строка имеет 3 элемента, а вторая строка - 5 элементов.Как это сделать в Java с помощью Arraylist.Спасибо.

Ответы [ 9 ]

3 голосов
/ 04 июня 2011

Как насчет List<List<Foo>>?

Например:

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

List<Foo> row1 = new ArrayList<Foo>();
row1.add(new Foo());
row1.add(new Foo());
row1.add(new Foo());
list.add(row1);

List<Foo> row2 = new ArrayList<Foo>();
row2.add(new Foo());
row2.add(new Foo());

list.add(row2);
2 голосов
/ 04 июня 2011

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

@SuppressWarnings("unchecked")
ArrayList<T>[] arr = new ArrayList[ fixedsize];

или использовать вложенные списки ArrayLists:

List<List<T>> list = new ArrayList<List<T>>( fixedsize );
2 голосов
/ 04 июня 2011
ArrayList<ArrayList<SomeObject>> twodlist = new ArrayList<ArrayList<SomeObject>>();
ArrayList<SomeObject> row = new ArrayList<SomeObject>();
row.add(new SomeObject(/* whatever */));
// etc
twodlist.add(row);
row = new ArrayList<SomeObject>();
// etc
1 голос
/ 04 июня 2011

Попробуйте:

ArrayList<ArrayList<DataType>> array = new ArrayList<ArrayList<DataType>>();
for (int i = 0; i < n; ++i) {
    array.add(new ArrayList<DataType>());
}
0 голосов
/ 04 июня 2011

Я бы создал массив ArrayList (ArrayList [3] rows = new ArrayList [3], если строк 3) Затем для каждой строки создайте классы столбцов и вставьте их в ArrayList.и затем поместите ArrayList в массив.Индекс массива строк можно использовать для отслеживания номера строки.Помните, что массивы начинаются там с индексов с 0, поэтому номер строки будет строкой [index + 1]

0 голосов
/ 04 июня 2011
List<ArrayList<SomeObject>> twoDList = new ArrayList<List<SomeObject>>(n);
for( int i=0; i<n; i++ )
    twoDList.add( new ArrayList<SomeObject>() );

Использовать как:

twoDList.get(rownumber).add(newElementInColumn);
0 голосов
/ 04 июня 2011

если число строк фиксировано, попробуйте что-то вроде этого:

ArrayList<MyObject>[] = new ArrayList<MyObject>[fixedRows]
0 голосов
/ 04 июня 2011

Вы можете создать массив элементов ArrayList, так как количество строк фиксировано.

ArrayList[] dynamicArray = new ArrayList[n]();

Примечание. Вам нужно будет разместить объект ArrayList в каждой записи массива. Итак ...

for (int loop = 0; loop < n; loop++)
dynamicArray[loop] = new ArrayList();

ИЛИ если вы хотите, чтобы строки и столбцы были динамическими, вы можете создать ArrayList из ArrayLists ....

ArrayList<ArrayList<T>> dynamicArray = new ArrayList<ArrayList<T>>();

Еще раз, вам нужно будет создать список массивов в каждой новой записи в dynamicArray.

0 голосов
/ 04 июня 2011

Как вы говорите, вы можете создать массив массивов списков и использовать конструктор ArrayList (int начальная емкость), чтобы установить емкость каждого столбца:

ArrayList<YourObject>[] rows=new ArrayList<YourObjects>[n];
for(i=0;i<n;i++){
rows[i]=ArrayList<YourObjects>(initialsize);
}
...