2013-10-25 26 views
0

我有一個奇怪的錯誤,我不能讓我的頭在.size()方法看起來不會返回正確的值。ArrayList.size()返回不正確的值

這第一位代碼創建ArrayList。

public void createResultList(String query) { 
    ArrayList<ArrayList<String>> data = new ArrayList(); 

    try { 
     ResultSet rs = st.executeQuery(query); 
     ResultSetMetaData meta = rs.getMetaData(); 

     for(int i = 0; i < meta.getColumnCount(); i++) { 
      data.add(i, new ArrayList<String>()); 
     } 

     int x = 0; 
     while(rs.next()) { 
      for(int y = 0; y < meta.getColumnCount(); y++) { 
       data.get(x).add(rs.getString(y + 1)); 
      } 
      x++; 
     } 


    } catch(Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 

    ResultTable result = new ResultTable(data); 
    JTable table = new JTable(result); 
    JScrollPane scrollpane = new JScrollPane(table); 
    add(scrollpane); 
    refresh(); 
} 

這是我的TableModel類,它用於創建傳遞給它的表。

public class ResultTable extends AbstractTableModel { 

    private ArrayList<ArrayList<String>> data; 

    public ResultTable(ArrayList<ArrayList<String>> data) { 
     this.data = data; 
    } 

    public int getColumnCount() { 
     return data.get(0).size(); 
    } 

    public int getRowCount() { 
     return data.size(); 
    } 

    public Object getValueAt(int row, int col) { 
     return data.get(row).get(col); 
    } 
} 

現在的問題是在ResultTable類,現在選擇查詢返回一行12列,第一data.get(0).size()調用正確返回12,但第二個數據.size()調用錯誤地返回12而不是1,這是導致出界錯誤,任何人都可以請解釋這看似矛盾的結果?

+3

爲什麼你認爲'data.size()'應該返回'1'?你已經添加了相同數量的'ArrayList'作爲字符串的數量到內部'ArrayList' –

回答

2

這是你應該已經很容易,當你發現了調試代碼...

public void createResultList(String query) { 
    ArrayList<ArrayList<String>> data = new ArrayList(); 

數據的ArrayList

try { 
     ResultSet rs = st.executeQuery(query); 

查詢返回的ArrayList荷蘭國際集團1行12列

 ResultSetMetaData meta = rs.getMetaData(); 
     for(int i = 0; i < meta.getColumnCount(); i++) { 

對於在您的記錄每列,是12的,您可以添加在數據

  data.add(i, new ArrayList<String>()); 
     } 

導致數據是12周空的ArrayList 這已經是一個ArrayList的一個空的ArrayList解釋了爲什麼data.size()== 12

 int x = 0; 
     while(rs.next()) { 

在您的記錄集中的每個記錄,爲1

  for(int y = 0; y < meta.getColumnCount(); y++) { 

爲在您的記錄每列,爲12,你用相同的指數字符串添加到ArrayList作爲記錄

   data.get(x).add(rs.getString(y + 1)); 
      } 

數據的第一個的ArrayList(data.get(0))將有12個字符串 所有其它的ArrayList在數據(data.get(X),其中x> 0)將保持爲空

  x++; 
     } 

導致數據被的12周的ArrayLists 其中只有所述第一ArrayList中有12個字符串的ArrayList和其他人都是空的

} catch(Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 

    ResultTable result = new ResultTable(data); 
    JTable table = new JTable(result); 
    JScrollPane scrollpane = new JScrollPane(table); 
    add(scrollpane); 
    refresh(); 
} 
+0

Doh!謝謝,我認爲我非常關注添加字符串的代碼部分,因此我忘記了添加ArrayLists的前一部分。 –

0

當您創建data列表時,您將創建一個子列表來保存每列的數據。

如果這是你想做的事,你應該從結果集列表中的每列對應於它添加數據:

while(rs.next()) { 
     for(int y = 0; y < meta.getColumnCount(); y++) { 
      data.get(y).add(rs.getString(y + 1)); 
     } 
    }