2014-01-28 33 views
0

我有一个自定义AbstractTableModel的Java TableModel的HashMap的VS列表

这种模式存储在HashMap数据。因此,对于我的getValueAt(int rowIndex, int columnIndex)

方法我做

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

但是我的数据有超过2000个条目,这样算下来,每一次每当我要得到的数据我的表造成了巨大的性能损失。

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

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

感谢任何人的建议,并且我对可能是一个愚蠢的问题表示感谢,但是当谈到表格以及如何在其中存储数据时,我并不是太好。

回答

1

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

A ArrayList of ArrayList s是一种合理的方式来存储表模型。这仍然给你快速访问。进入一个特定的行是一个恒定的时间查找,然后获得该列也是一个恒定的时间查找。

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

1

是的,你看到的代码会在性能方面很糟糕 - 对于你渲染的每个单元格,你将根据Map(你可以计算)的值创建一个新的ArrayList。至少,可以在你的表模型的构造函数中做一次列表创建,就像这样(假设你有一些任意的对象,你没有在你的问题中提到,因为值的地图):

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); 
    } 
}