Я создаю TableModel, который будет иметь постоянное число столбцов, но количество строк будет изменяться (главным образом, увеличиваясь как функция времени). Который был бы лучшим подходом, чтобы хранить данные,
ArrayList[] columns = new ArrayList[numberOfColumns];
// Each array element is one column. Fill each of them with a new ArrayList.
...
public Object getValueAt(int row, int column) {
return columns[column].get(row);
}
т.е. создание массива ArrayList
s, каждый ArrayList
представление одного столбца, или:
ArrayList
т.е. создание одного ArrayList, который содержит массивы, каждый из которых представляют одну строку.
Какие-либо идеи, какой из них более эффективен с точки зрения скорости или устройства хранения данных? Альтернативный 1 требует расширения N ArrayList
s с каждой добавленной строкой, в то время как альтернативные 2 требует расширения всего один ArrayList
но также и создание нового массива длины N (для представления новой строки). Или есть ли очевидное, лучшее решение?
Если количество столбцов фиксировано, то ваши данные, вероятно, ориентированы на строки или, по крайней мере, на переменные строки, и тогда каждая строка должна быть массивом. Фиксированное число столбцов означает, что вам не нужно перераспределять ваш массив.
Итак, ваша структура:
List<Object[]> rows;
где элемент массива - это одна строка.
Однако есть несколько вариантов того, каким должен быть объект строки:
List
или другая Коллекция
; или (3), вероятно, можно сделать с помощью какого-то интерфейса, позволяющего запрашивать количество, тип и имя столбцов.
Я бы выбрал вариант №2 по нескольким причинам
Во-первых, массивы имеют фиксированную длину, тогда как ArrayList гибкий. Учитывая, что ваше число столбцов фиксировано, кажется естественным иметь массив на строку.
Вариант №1 опасен тем, что он содержит неявное требование, что все списки ArrayList будут одинаковой длины. Вы можете случайно пренебречь добавлением к любому из них, создав тем самым ошибку. В варианте №2 такой проблемы не возникнет.
И наконец, похоже, что общепринятая концепция заключается в том, что сначала индексируются строки и только потом столбцы.
Лично я бы выбрал ArrayList массивов фиксированной длины. Если вы говорите о большом количестве строк, это может быть более эффективно (и, возможно, быстрее), чем выделение группы ArrayLists, которая начинается с массива длиной 10. Таким образом, если у вас меньше столбцов, чем 10 вы закончите с потраченным впустую пространством. С другой стороны, если у вас их больше, то ArrayList должен будет изменить размер своего резервного массива при добавлении дополнительных столбцов.
Изменить: на самом деле, вы можете установить емкость в конструкторе ArrayList, поэтому я думаю, это может не иметь большого значения: http://java.sun.com/j2se/1.5.0/ docs / api / java / util / ArrayList.html
Как насчет использования одного самого ArrayList и доступа к подобному элементу
public Object getValueAt(int row, int column) {
return data.get(row*NUMBER_OF_COLUMNS+column);
}
В этом случае каждый объект ArrayList является ячейкой в таблице. И вам не нужно никакой другой дополнительной структуры