6

我正在创建一个具有固定列数的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);
}

即创建一个s数组ArrayList,每个ArrayList代表一列,或者:

ArrayList<Object[]> rows = new ArrayList<Object[]>();
// 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 的新数组(以表示新行)。还是有明显更好的解决方案?

4

4 回答 4

6

如果列数是固定的,那么您的数据可能是面向行的或至少是行变量的,此时每行都应该是一个数组。固定列数意味着您不需要重新分配数组。

所以你的结构是:

List<Object[]> rows;

其中数组元素是一行。

但是,您的行对象应该是几个选项:

  1. 数组;
  2. 一个List或其他Collection;或者
  3. 自定义对象。

(3) 可能可以通过使用某种接口来完成,该接口允许您查询列的数量、类型和名称。

于 2010-02-23T08:22:08.007 回答
2

如何使用单个 ArrayList 本身并访问这样的元素

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

在这种情况下,每个 ArrayList 对象都是表格中的一个单元格。而且您不需要任何其他额外的结构

于 2010-02-23T08:23:57.753 回答
1

出于几个原因,我会选择选项 #2

首先,数组有固定的长度,而 ArrayList 是灵活的。鉴于您的#columns 已修复,每行都有数组似乎很自然。

选项 #1 是危险的,因为它隐含要求所有 ArrayList 的长度相同。您可能会不小心忽略添加到其中的任何一个,从而产生错误。在选项 #2 中您不会遇到此问题。

最后,似乎常见的约定是您首先索引行,然后才索引列。

于 2010-02-23T08:27:05.150 回答
1

就个人而言,我会选择固定长度数组的 ArrayList。如果您正在谈论大量行,这可能比分配一堆 ArrayList 更节省空间(并且可能更快),后者由长度为 10 的数组开始支持。因此,如果您的列数少于 10你最终会浪费空间。另一方面,如果您有更多,那么当您添加其他列时,ArrayList 将不得不调整其支持数组的大小。

编辑:实际上,您可以在 ArrayList 的构造函数中设置容量,所以我想它可能没有太大区别:http: //java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html

于 2010-02-23T08:30:08.243 回答