Господа,
Возникла надобность иметь матрицу расширяемую в одном измерении (в ширину, т.е. кол-во строк неизменно, кол-во столбцов динамично).
Собственно максимально простой подход который я увидел звучит как "массив листов" или так:
List[] a=new List[10];
Работает чудесно. Матрица заполняется, нормализуется и вот оно счастье.
Но нетипизированый лист не есть хорошо. Типизируем его:
List<Integer>[] a=new List<Integer>[10];
И что я имею? Ошибку компиляции! При том что само объявление, без инициализации
List<Integer>[] a;
компилируется!
Собственно понимаю, что конструкция выглядит диковато. Тем не менее, как её проинициализировать?
Пока юзаю извращение в виде
List<List<Integer>>
Здравствуйте, server_mouse, Вы писали:
А если так:
List<Integer>[] a = new List[10];
Я думаю, не получится создать массив из типизированных типов. Вроде какие-то проблемы с безопасностью. Хотя, может и не прав.
Подтверждение выше сказаному есть в generic-tutorial у Sun:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
7.3 Arrays
The component type of an array object may not be a type variable or a parameterized
type, unless it is an (unbounded) wildcard type.You can declare array types whose
element type is a type variable or a parameterized type, but not array objects.
Но если
очень хочется и java 6, то вроде тут описано как это сделать:
http://forum.java.sun.com/thread.jspa?threadID=651276&messageID=3832182
Либо еще есть один способ, но сейчас не помню, как. Что-то через рефлексию вроде. Тоже только в 1.6 появился.
Здравствуйте, LeonidV, Вы писали:
LV>Либо еще есть один способ, но сейчас не помню, как. Что-то через рефлексию вроде. Тоже только в 1.6 появился.
А вот здесь и он описан:
http://tech.puredanger.com/2007/02/27/generics-array-construction/ (где-то в середине есть решение).
Здравствуйте, server_mouse, Вы писали:
_>Господа,
_>Возникла надобность иметь матрицу расширяемую в одном измерении (в ширину, т.е. кол-во строк неизменно, кол-во столбцов динамично).
_>...
List<Integer>[] a=new List<Integer>[10];
И что я имею? Ошибку компиляции! При том что само объявление, без инициализации
нельзя писать new List();
Can I create an array whose component type is a concrete parameterized type?;
_>Собственно понимаю, что конструкция выглядит диковато. Тем не менее, как её проинициализировать?
_>Пока юзаю извращение в виде
_>_>List<List<Integer>>
_>
Зачем использовать коллекции для эмуляции массива? Я бы завел класс RowData и юзал бы Collection<RowData>.
Здравствуйте, server_mouse, Вы писали:
_>Но нетипизированый лист не есть хорошо. Типизируем его:
_>_>List<Integer>[] a=new List<Integer>[10];
_>
Ну можно же "инвертировать" логику — использовать не "массив листов", а "лист массивов":
List<Integer[]> a = new ArrayList<Integer[]>();
Здравствуйте, server_mouse, Вы писали:
_>Господа,
_>Возникла надобность иметь матрицу расширяемую в одном измерении (в ширину, т.е. кол-во строк неизменно, кол-во столбцов динамично).
_>Собственно максимально простой подход который я увидел звучит как "массив листов"
int[][] a = new int[3][];
a[0] = new int[10];
a[1] = new int[20];
a[2] = new int[30];
не?