2014-01-28 35 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); 
    } 
}