2015-09-02 112 views
0

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

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); 
     } 
    } 
+1

这个'Column'从哪里来的?它以任何方式依赖于'Table'? –

+0

@DirkLachowski该列是一个列表,其大小与表列表 –

+0

似乎很奇怪,可以同时迭代2个迭代器。有一个未来的错误写在它上面。一个'Iterator >'或者一些包含2个字符串的类可以更好地捕捉这些字符串的点,我认为更有意义。 – Cruncher

回答

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

因此,“重置”迭代器的最佳方法是向聚合请求迭代器本身的新实例。

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循环。

+1

在其示例中不可能使用** foreach **构造。 –

+0

后者比前者好得多,并且使用迭代器实现。前者是不好的形式,不应该使用。最好将实施迭代的工作留给列表本身。因为如果这是一个链表或其他列表,这可能是一种较慢的迭代方式。 – Cruncher

+0

@Cruncher riccardo是正确的,每个循环都不能用于一次迭代2个列表。 – Zarwan

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

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