2013-07-09 62 views
3

我的問題是這樣的:我有一個迭代器類,它應該遍歷給定的數據結構中的元素,我們可以說,但是我設法完成的是當我傳入數據結構,它將迭代數據結構本身。迭代通過數據結構的元素而不是集合

即。 DynamicIterator it = new DynamicIterator(da);
說da是一個數組輸出將是[1,2,3,4,5,6]而不是1,2,3,4,5,6

我的問題是,更重要的是,理解處理這一問題的普遍接受的做法不僅僅是問題本身。

編輯代碼:

public class X<E> 
{ 
    private final E[] rray; 
    private int currentIndex = 0; 

    public X(E... a) 
    { 
     //if the incoming array is null, don't start 
     if(a == null) 
     { 
      System.out.println("Array is null"); 
      System.exit(1); 
     } 
     //set the temp array (rray) to the incoming array (a) 
     this.rray = a; 
    } 

    //hasNext element? 
    public boolean hasNext() 
    { 
     return rray.length > currentIndex; 
    } 

    //next element (depends on hasNext()) 
    public E next() 
    { 
     if (!hasNext()) 
     { 
      System.out.println("Element doesn't exist, done"); 
      System.exit(1); 
     } 
     return rray[currentIndex++]; 
    } 

    //return array 
    public E[] access() 
    { 
     return rray; 
    } 
} 
+0

你可以使用反射來做到這一點。按照本教程從類中獲取每個字段和值:http://tutorials.jenkov.com/java-reflection/fields.html。 –

+0

感謝您的迴應!我會給它一個鏡頭。 – Hans

+0

這裏的問題是我們不知道任何關於底層數據結構的知識,只能說你可以迭代它。 – Hans

回答

1

您將無法使用完全通用的參數<E>做到這一點 - 你將如何通過Throwable重複,例如?你的類X目前所做的是在其構造函數中接受任意數量的對象,然後依次返回每個對象。

如果您限制傳入的對象的邊界以實現例如Iterable,那麼你就可以真正開始「往裏」他們並返回它們的內容:

public class X<E> { 
    private final Iterator<E> it; 

    public X(Iterable<E> a) { 
     it = a.iterator(); 
    } 

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

    public E next() { 
     return it.next(); 
    } 
} 

雖然這並不能真正做到什麼不同,只是使用a.iterator(),而不是直接的X實例...

+0

的確如此,老實說,我因爲這個原因而感到困惑。我非常感謝你的洞察力,Iterable對我來說是全新的,所以你的迴應是完全可怕的,我期待的是;我只是沒有意識到解決方案會如此簡單。 – Hans

+0

只要我有足夠的代表,我會回來,並投票給你。謝謝。 – Hans