2013-11-23 79 views
0

我的名單看起來是這樣的:有麻煩創建我自己的列表迭代器

public class SList<A> implements Iterable<A> 
{ 
    private Listelem head; 
    private Listelem current; 
    private boolean listEmpty; 

    private class Listelem 
    { 
     private A value; 
     private Listelem next; 

     private Listelem(A val) 
     { 
      this.value = val; 
      this.next = null; 
     } 
     private Listelem() 
     { 
      this.next = null; 
     } 

     public void setValue(A val) 
     { 
      this.value = val; 
     } 
     public A getValue() 
     { 
      return this.value; 
     } 
     public void setSuccessor(Listelem next) 
     { 
      this.next = next; 
     } 
     public Listelem getSuccessor() 
     { 
      return this.next; 
     } 
    } 
} 

我要爲這個列表創建一個迭代器,但我有一些麻煩。 在SLIST我這樣做:

@Override 
public Iterator<A> iterator() { 
    Iterator<A> it = new Iterator<A>() { 

     this.current = this.head; 

     @Override 
     public boolean hasNext() { 
      boolean hasNext = true; 
      if(this.current.getSucessor == null) 
      { 
       hasNext = false; 
      } 
      return hasNext; 
     } 

     @Override 
     public A next() { 
      A next  = this.current.getValue; 
      this.current = this.current.getSuccessor(); 
      return next; 
     } 

     @Override 
     public void remove() { 
      // TODO Auto-generated method stub 
     } 
    }; 
    return it; 
} 

我不能老是參考this.current或this.head。我想知道爲什麼這不起作用,因爲我在同一班。

+0

太多的代碼,你至少可以指向你堅持的位?它不讓你參考它? – FaddishWorm

回答

1

你只是忘了在你的Iterator中聲明一個current字段。列表頭應該用SList.this.head或簡單地用head來訪問。 this引用迭代器實例。不在列表中。你應該使用一個非匿名類:

@Override 
public Iterator<A> iterator() { 
    return new MyListIterator(); 
} 

private class MyListIterator implements Iterator<A> { 
    private Listelem current; 

    private MyListIterator() { 
     this.current = head; 
    } 

    @Override 
    public boolean hasNext() { 
     return this.current.getSucessor != null; 
    } 

    @Override 
    public A next() { 
     A next  = this.current.getValue; 
     this.current = this.current.getSuccessor(); 
     return next; 
    } 

    @Override 
    public void remove() { 
     // TODO Auto-generated method stub 
    } 
} 
1

您正在創建一個帶有new的新迭代器,因此您處於班級的匿名內部類中。試用SList.this.current

0

嘗試SList.this.head。您正試圖引用您定義的Iterator子類中不存在的字段。

取而代之,您要參考封閉的SList類的head字段。這就是您可以通過使用我在開始發佈的代碼片段獲得的內容。

+0

迭代器的當前元素不應該在列表中。它應該是迭代器對象的一個​​字段。 –