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

标签 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 列的一行的选择查询,第一个 data.get(0).size() 调用正确返回 12,但第二个 data.size()调用错误地返回 12 而不是 1,这会导致越界错误,有人可以解释一下这个看似矛盾的结果吗?

最佳答案

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

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

数据是 ArrayList 的 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 个空 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 中的所有其他 ArrayList(data.get(x),其中 x > 0)将保持为空

            x++;
        }

导致数据成为 12 个 ArrayList 的 ArrayList 其中只有第一个ArrayList有12个String,其他都是空的

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

关于java - ArrayList.size() 返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19592737/

相关文章:

java - 我的空 "public class xList<E> extends ArrayList<E>"是具体的吗?

java - 使用 javabean 显示 arraylist 对象

java - 我可以使字节数组的大小动态化吗?

size - 静态数据繁重的 Rust 库似乎臃肿

java - 在 DAO 层中捕获通用异常是一种不好的做法吗?

java - ProcessBuilder启动java程序: IOException.无法启动进程。原因:无法运行程序CreateProcess error=2

ios - 图片的 Graph API 更改

android - 应用程序在同一型号的两部手机中显示不同的文字大小

java - 无法使用 Neo4j Rest API 进行查询 - 读取为 JSON 时出错 ''

android - 递归 + 900 个元素 + 邻居检查 = 导致 stackoverflow