ArrayList массивов по сравнению с массивом ArrayLists по сравнению с чем-то подобным

Я создаю 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);
}

т.е. создание массива ArrayLists, каждый ArrayList представление одного столбца, или:

ArrayList rows = new ArrayList();
// Each ArrayList element is one row.

public Object getValueAt(int row, int column) {
    return rows.get(row)[column];
}

т.е. создание одного ArrayList, который содержит массивы, каждый из которых представляют одну строку.

Какие-либо идеи, какой из них более эффективен с точки зрения скорости или устройства хранения данных? Альтернативный 1 требует расширения N ArrayLists с каждой добавленной строкой, в то время как альтернативные 2 требует расширения всего один ArrayList но также и создание нового массива длины N (для представления новой строки). Или есть ли очевидное, лучшее решение?

6
задан Joonas Pulakka 23 February 2010 в 08:29
поделиться

4 ответа

Если количество столбцов фиксировано, то ваши данные, вероятно, ориентированы на строки или, по крайней мере, на переменные строки, и тогда каждая строка должна быть массивом. Фиксированное число столбцов означает, что вам не нужно перераспределять ваш массив.

Итак, ваша структура:

List<Object[]> rows;

где элемент массива - это одна строка.

Однако есть несколько вариантов того, каким должен быть объект строки:

  1. Массив;
  2. Список List или другая Коллекция; или
  3. Пользовательский объект.

(3), вероятно, можно сделать с помощью какого-то интерфейса, позволяющего запрашивать количество, тип и имя столбцов.

6
ответ дан 10 December 2019 в 00:37
поделиться

Я бы выбрал вариант №2 по нескольким причинам

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

Вариант №1 опасен тем, что он содержит неявное требование, что все списки ArrayList будут одинаковой длины. Вы можете случайно пренебречь добавлением к любому из них, создав тем самым ошибку. В варианте №2 такой проблемы не возникнет.

И наконец, похоже, что общепринятая концепция заключается в том, что сначала индексируются строки и только потом столбцы.

1
ответ дан 10 December 2019 в 00:37
поделиться

Лично я бы выбрал ArrayList массивов фиксированной длины. Если вы говорите о большом количестве строк, это может быть более эффективно (и, возможно, быстрее), чем выделение группы ArrayLists, которая начинается с массива длиной 10. Таким образом, если у вас меньше столбцов, чем 10 вы закончите с потраченным впустую пространством. С другой стороны, если у вас их больше, то ArrayList должен будет изменить размер своего резервного массива при добавлении дополнительных столбцов.

Изменить: на самом деле, вы можете установить емкость в конструкторе ArrayList, поэтому я думаю, это может не иметь большого значения: http://java.sun.com/j2se/1.5.0/ docs / api / java / util / ArrayList.html

1
ответ дан 10 December 2019 в 00:37
поделиться

Как насчет использования одного самого ArrayList и доступа к подобному элементу

public Object getValueAt(int row, int column) { 
    return data.get(row*NUMBER_OF_COLUMNS+column); 
} 

В этом случае каждый объект ArrayList является ячейкой в ​​таблице. И вам не нужно никакой другой дополнительной структуры

2
ответ дан 10 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: