0

我有一个习惯AbstractTableModel

该模型将数据存储在HashMap. 所以对于我的方法getValueAt(int rowIndex, int columnIndex)

我愿意

new ArrayList<Object>(data.values()).get(index);

但是,我的数据有超过 2000 个条目,因此每当我必须为我的表获取数据时,每次都这样做会造成巨大的性能损失。

那么您可以推荐什么解决方案?

我应该尝试使用List来存储我的所有数据而不是HashMap
使用表模型时存储数据的公认标准是什么?

感谢任何人的建议,我为这可能是一个愚蠢的问题表示歉意,但在涉及表格以及如何在表格中存储数据时,我并不是很好。

4

2 回答 2

1

AHashMap通常不适合表模型,因为表需要能够访问行/列位置的数据。

A ArrayListof ArrayLists 是存储表模型的合理方式。这仍然可以让您快速访问。获取特定行是一个恒定时间查找,然后获取该列也是一个恒定时间查找。

如果您不想要列表的开销,您始终可以将数据存储在二维数组中。

于 2014-01-28T16:51:31.167 回答
1

是的,你看到的代码在性能方面会很糟糕——对于你渲染的每个单元格,你正在ArrayList根据你的值创建一个新的Map(你可以做数学)。

至少,做一次列表创建,可能在你的表模型的构造函数中,像这样(假设你有一些你没有在你的问题中提到的任意对象,作为地图的值) :

public class MyTableModel extends AbstractTableModel
{
  private static final int COLUMN_0 = 0;
  private static final int COLUMN_1 = 1;

  private List<MyObject> data;

  public MyTableModel(Map<?, MyObject> data)
  {
    this.data = new ArrayList<MyObject>(data.values());
  }

  public Object getValueAt(int rowIndex, int columnIndex)
  {
    switch (columnIndex)
    {
      case COLUMN_0: return this.data.get(rowIndex).getColumn0();
      case COLUMN_1: return this.data.get(rowIndex).getColumn1();
      ...
      case COLUMN_N: return this.data.get(rowIndex).getColumnN();
    }

     throw new IllegalStateException("Unhandled column index: " + columnIndex);
  }
}
于 2014-01-28T17:00:24.133 回答