Java获取内部ArrayList的大小

时间:2016-05-31 10:00:34

标签: java for-loop arraylist

static ArrayList<String> tableNamesMD = new ArrayList<String>();
static ArrayList<ArrayList<String>> columnNamesMD = new ArrayList<ArrayList<String>>();

填充两个数组后

for(int i = 0; i < tableNamesMD.size(); i++) {
        System.out.println(tableNamesMD.get(i));

        for(int j = 0; j < tableNamesMD.get(i).size(); j++) {
            //do stuff here
        }
}

tableNamesMD.get(i).size()

内部for循环出错

它说“方法大小()未定义类型String”

2 个答案:

答案 0 :(得分:2)

在你的另一个循环中,你遍历tableNamesMD的所有String个实例的元素。当您获得i - String时,调用size()会引发编译时错误。

可能你的意思是:

for (int i = 0; i < tableNamesMD.size(); i++) {
    System.out.println(tableNamesMD.get(i));

    for(int j = 0; j < columnNamesMD.get(i).size(); j++) {
        //do stuff here
    }
}

答案 1 :(得分:0)

我假设您要迭代所有表,并且对于每个表迭代其列,我也假设表tableNamesMD.get(i)的列是columnNamesMD.get(i),在这种情况下Kostantin的答案会工作的。

但是,我认为设计自然存在缺陷。因为很自然地,我们希望迭代所有表并处理与每个表相关联的一些数据,我们应该以面向对象的方式进行这种关联,即:

public interface Table {
    String getName();
    List<Column> getColumns();
}

public interface Column {
    String getName();
}

然后迭代代码看起来像

List<Table> tables = ...;
for (Table table : tables) {
    System.out.println(table.getName());
    for (Column column : columns) {
        System.out.println(column.getName());
    }
}

我们通过列表索引消除了表及其列之间的关联,并用foreach语句替换了for。这两项改变在提高代码的可读性方面都有很长的路要走,这有很多令人满意的副作用。

另请注意,我们可以使用像此

的流API重写此内容
tables.forEach(table -> {
    System.out.println(table.getName());
    table.getColumns().forEach(column -> System.out.println(column.getName()));
});

一般来说,我会说如果某种东西被认为是面向对象编程中的一个实体,那么它应该是一个类。