迭代两个迭代器

时间:2015-09-02 15:17:29

标签: java iterator

我有两个数组列表,其中包含不同数量的项目。 第一次迭代运行良好,但是当它继续下一步时,没有任何事情发生,我怀疑是因为第二个迭代器没有下一个。无论如何重置它?

Iterator<Integer> itID = ID.iterator();
    Iterator<String> itTable = Table.iterator();
    Iterator<String> itColumn = Column.iterator();
    while(itID.hasNext()){
        int i = itID.next();
        System.out.println(i);
        while(itTable.hasNext()){
            String SQL = "select " + itColumn.next() + " from " +  itTable.next() + " where id=" + i;
            System.out.println(SQL);
        }
    }

3 个答案:

答案 0 :(得分:3)

我认为问题是你必须在第一个周期内移动迭代器itTableitColumn的实例化。

Iterator<Integer> itID = ID.iterator();
while (itID.hasNext()) {
    // Every time you ask for an iterator, you obtain a new one.
    Iterator<String> itTable = Table.iterator();
    Iterator<String> itColumn = Column.iterator();
    int i = itID.next();
    System.out.println(i);
    while(itTable.hasNext()){
        String SQL = "select " + itColumn.next() + " from " +  itTable.next() + " where id=" + i;
        System.out.println(SQL);
    }
}

这是&#34;重置&#34;的最佳方式迭代器是向聚合器请求迭代器本身的新实例。

答案 1 :(得分:0)

嵌套循环中使用的迭代器应该在第一个循环内部初始化,以便每次外循环迭代时都会重置它们。

但你可以(而且应该)只使用for循环来遍历ArrayList

for (int i = 0; i < myList.size(); i++) {
    // use myList.get(i)
}

或者只是

for (String s : myList) { // Change string to whatever type your list is holding
    // use 's'
}

第二个循环称为for each循环。它专为迭代列表和数组而设计。为了你的目的,这个将无法工作,因为你正在迭代2个列表,但我认为无论如何我都会提出它。你应该使用第一个for循环。

答案 2 :(得分:0)

稍微超出了问题的范围,但这是我的想法。 迭代两个你认为大小相同的列表,就是在寻找麻烦。如果这两个值应该耦合在一起,那么......将它们耦合在一起。以下课程可以做到这一点:

class SQLField 
{
    private String tableName;
    private String columnName;
    public SQLField(String tableName, String columnName) {
        this.tableName = tableName;
        this.columnName = columnName;
    }

    public getSelect() {
        return "select " + this.columnName + " from " + this.tableName
    }
}

这使得使用代码:

Iterator<Integer> itID = ID.iterator();
while (itID.hasNext()) {
    // Every time you ask for an iterator, you obtain a new one.
    Iterator<SQLField> fields = SQLFields.iterator();
    int i = itID.next();
    System.out.println(i);
    for(SQLField field : fields) {
        String SQL = field.getSelect() + " where id = " + i;
        System.out.println(SQL);
    }
}

在我看来,这是一种更好的方法。