0

注意:在现实生活中,我会使用适当的 Java collection,但在这个任务中,我想从头开始做所有事情。

我已经在 SO 和其他网络上完成了我的谷歌搜索,但没有找到我正在寻找的东西。

我的理解是for-each循环可以在任何实现iterable接口的类上运行,同时这个类不必实现iterator。我在这里吗?

比方说,我有以下两个类,它们不是从任何其他类显式派生的。

public class Pile {

   private Thing aThing = new Thing(); 

   // other varibles
   // constructor
   // other methods (including getters and setters)
}

public class Thing {

   private object value;   // Payload
   private Thing link1;    // variables that enable awareness
   private Thing link2;    // of other Thing objects
                           // For example, link1 could be reference to the previous object
                           // and link2 - to the next

   // other varibles
   // constructor
   // other methods (including getters and setters)
}

在此示例中,Pile将是double-linked List. 但它不必。

我的目标是IterablePile通过继承创建类。

public class IterablePile extends Pile {
}

接口的唯一要求Iterable是实现Iterator方法。

在这里我很难过。似乎所有示例(或者至少是我到目前为止发现的示例)都立即假定我的类是从 Java 之一派生的collections(例如ArrayList)。

如果不是这样呢?在这种情况下究竟需要做什么?需要采取哪些步骤?

你能指出我正确的方向吗(最好不要自己编写代码)?

还有一个问题。如果Thing是 a private inner class,情况会改变Pile吗?

在我看来,我错过了一些基本的东西,但不能指望它。

4

1 回答 1

4

如果您只IterablePile需要迭代,那么您只需要实现Iterable将提供Iterator. 这是一个基本示例:

public class IterablePile extends Pile implements Iterable<Thing> {
    //current class implementation...
    private class MyIterablePileIterator implements Iterator<Thing> {
        private Thing thing;
        private MyIterablePileIterator(Thing thing) {
            this.thing = thing;
        }
        @Override
        public boolean hasNext() {
            //add the implementation...
            return (thing.getLink1() != null || thing.getLink2() != null);
        }
        @Override
        public Thing next() {
            //add the implementation...
            //since it is a tree structure, you could use a Queue<Thing>
            //to implement prefix, infix or postfix navigation
        }
        @Override
        public void remove() {
            //add the implementation...
            //in case you don't want to implement it, you can leave it blank
            //or throw new UnsupportedOperationException("never remove!")
        }
    }
    @Override
    public Iterator<Thing> iterator() {
        return new MyIterablePileIterator(getAThing());
    }
}

尽管如此,我还是觉得很奇怪,只有你的IterablePile可以迭代,而Pile不会。请注意,您的代码应面向接口(或抽象/超类)而不是特定实现。无论如何,这应该做。

更多信息:

于 2013-09-24T21:24:54.910 回答