2015-11-10 45 views
2

我试图做一个foreach循环作为遵循一个LinkedList式的I类建:迭代器执行造成死循环

boolean contains = false; 
for(Thing t : front) { 
    if(t.equals(something)) { 
     t.doSomething(); 
     contains = true; 
     break; 
    } 
} 

这是迭代方法,我已经实现了:

@Override 
public Iterator<Thing> iterator() { 
    Thing current = this; 
    return new Iterator<Thing>() { 
     public boolean hasNext() { 
      return current.hasNext(); 
     } 

     public Thing next() { 
      return current.next; 
     } 
    }; 
} 

我试过调试这个,它似乎没有返回链表中的下一个元素,因此当我运行它并尝试执行foreach循环时导致无限循环。

对不起,如果这个问题已被回答,或者有一个非常愚蠢的错误,我搜索了一段时间,找不到答案。这是我第一次写一个迭代器,所以请温和。 :)

回答

6

你必须推进next()Iterator的状态:

public Thing next() { 
     current = current.next; 
     return current; 
    } 

否则,next()所有通话将返回相同的元素。

编辑:

你应该将你的局部变量声明Thing current = this;您的匿名类实例内(即把它变成一个实例变量)。

@Override 
public Iterator<Thing> iterator() { 
    return new Iterator<Thing>() { 

     private Thing current = Thing.this; 

     public boolean hasNext() { 
      return current.hasNext(); 
     } 

     public Thing next() { 
      current = current.next; 
      return current; 
     } 

    }; 
} 
+0

当我这样做时,在Eclipse中出现错误:“在封闭范围内定义的局部变量当前必须是最终的或有效的最终结果”。 我试着改变下面的方法: public Thing next(){ \t Thing tmp = current; \t tmp = current.next; \t return tmp; } 但它仍然没有前进到列表中的下一个元素。 – Tbs95

+0

@ Tbs95方法中的匿名类对封闭方法内的变量没有更改权限。您需要将'current'变量作为'Iterator'的实例变量,因为它是迭代器状态的一部分。 – khelwood

+0

谢谢@Eran,但现在我已经更改了变量声明位置,我得到一个类型不匹配错误,将新的迭代器(){}转换为Thing。 – Tbs95