ArrayList.size()返回不正确的值

时间:2013-10-25 14:35:29

标签: java arraylist size

我有一个奇怪的错误,我无法理解.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列的select查询,第一个data.get(0).size()调用正确返回12,但是第二个data.size()调用错误也会返回12而不是1,这会导致越界错误,任何人都可以解释这个看似矛盾的结果吗?

2 个答案:

答案 0 :(得分:2)

这是你在调试代码时应该很容易找到的东西......

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

data是ArrayLists的ArrayList

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

返回1行12列的查询

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

对于记录集中的每一列,为12,您在数据中添加一个空的ArrayList

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

导致数据是12个空Arraylists的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个字符串 数据中的所有其他ArrayLists(data.get(x),其中x> 0)将保持为空

            x++;
        }

导致数据是12个ArrayLists的ArrayList 其中只有第一个ArrayList有12个字符串而其他的是空的

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

答案 1 :(得分:0)

创建data列表时,您可以创建一个子列表来保存每列的数据。

如果这是您想要做的,您应该将结果集的每一列中的数据添加到与其对应的列表中:

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