2013-02-01 144 views
0

我想在遞歸方法中使用迭代器。如果列表中沒有下一個元素,它應該退出該方法。但是如果光標處於最後位置,與iterator.hasNext()的檢查返回true,我除了falseiterator.hasNext()返回錯誤的值

任何想法和提示?

我不是爲了發佈圖片,所以我會寫下來。這就是我看到在Eclipse的調試器查看:

iterator    | AbstractList$Itr (id=448) 

- cursor   | 2 
- excpectedModCount | 2 
- lastRet   | 1 
- this$0   | ArrayList<E> (id=438) 
- elemtData   | Object[10] (id=462) 

---modCount   | 2 

---size    | 2 

下面的代碼

static void resolveWithIterator(List<SomethingContext> list, Iterator<ContextResolveHelper> iterator, List<ContextResolveHelper> resolverList) 
{ 
    boolean end = resolverList.iterator().hasNext(); 
    if (list.size() == 1 || !end){ 
     resolvedList.add(list); 
     return; 
    }else{ 
     ContextResolveHelper acutalEntry = iterator.next(); 
    List<SomethingContext> tempQRes2 = new ArrayList<SomethingContext>(); 
     for (SomethingContext smtCtx : list){ 
      if (//check various things){ 
       tempQRes2.add(smtCtx); 
      } 
     } 
     resolveWithIterator(tempQRes2, iterator, resolverList); 
    } 
} 
+1

你可以粘貼暴露你的問題的代碼? – zibi

+1

這聽起來像是你正在解釋實現細節 - 例如字段'cursor'的含義。它是否返回了*明顯不正確的值? –

+0

作爲你傳遞迭代器和resolverList的參數,這是一個通過resolverList的迭代器嗎? – zibi

回答

2

我認爲這個問題是,當你寫的,與您通話的功能邏輯本身:

Iterator<ContextResolveHelper> iterator = resolverList.iterator();  
resolveWithIterator(searchCtxResult, iterator, resolverList); 

,但在方法本身你2個獨立的東西,你下次檢查新的迭代器,不是提供的那個

boolean end = resolverList.iterator().hasNext(); 

這將始終返回true時,至少有一個元素。

調用iterator()總是返回新的迭代器,您應該使用參數中提供的那個。

+0

oooooohhhh!謝謝我錯過了樹林!這是正確的,如果我檢查正確的對象一切正常。 – Trival

1

唯一hasNext()我看到的是resolverList.iterator().hasNext()。既然你每次都得到一個新的迭代器,當然它總會有一個「next」,除非列表本身是空的。

+0

對不起,我不明白。我想我總是把相同的迭代器對象給下一個遞歸方法調用? – Trival

+0

您確實遞歸傳遞迭代器,但這不是您調用hasNext()的迭代器。 –

+0

是的,現在我看到了我的錯,謝謝並且對於愚蠢的問題感到抱歉! – Trival