2013-07-09 61 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