2015-09-02 46 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); 
    } 
} 

這在我看來是一個更好的方法。