0

我有一个奇怪的错误,我无法理解 .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,但第二个 data.size() 调用错误返回12 也不是 1,这导致了越界错误,谁能解释一下这个看似矛盾的结果?

4

2 回答 2

2

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

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

数据是 ArrayLists 的 ArrayList

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

返回 1 行 12 列的查询

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

对于记录集中的每一列,即 12,您在 data 中添加一个空的 ArrayList

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

导致 data 是 12 个空 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));
            }

data 中的第一个 ArrayList (data.get(0)) 将有 12 个字符串 data 中的所有其他 ArrayLists (data.get(x) where x > 0) 将保持为空

            x++;
        }

导致数据是 12 个 ArrayList 的 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();
}
于 2013-10-25T15:09:19.750 回答
0

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

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

    while(rs.next()) {
        for(int y = 0; y < meta.getColumnCount(); y++) {
            data.get(y).add(rs.getString(y + 1));
        }
    }
于 2013-10-25T14:46:17.263 回答