gpt4 book ai didi

java - 如何使用 for-each 循环创建一个类(不是集合的后代) "compatible"?

转载 作者:行者123 更新时间:2023-12-01 18:43:23 25 4
gpt4 key购买 nike

注意:在现实生活中,我会使用适当的 Java 集合,但在此任务中,我希望一切从头开始。

我已经在 SO 和网络的其余部分上进行了谷歌搜索,但没有找到我想要的东西。

据我了解,for-each 循环可以在任何实现 iterable 接口(interface)的类上运行,但同时该类不能必须实现迭代器。我在这儿吗?

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

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 将是一个双链表。但这不是必须的。

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

public class IterablePile extends Pile {
}

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

我被难住了。似乎所有示例(或者至少是我迄今为止发现的示例)都立即假定我的类派生自 Java collections 之一(例如 ArrayList)。

如果情况并非如此怎么办?在这种情况下具体需要做什么?需要采取什么步骤?

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

还有一个问题。如果ThingPile私有(private)内部类,情况会改变吗?

在我看来,我错过了一些基本的东西,但无法指出它。

最佳答案

如果只有您的 IterablePile 需要迭代,那么您只需实现 Iterable 接口(interface)即可提供 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 则不行。请注意,您的代码应该面向接口(interface)(或抽象/父类(super class))而不是特定的实现。无论如何,这应该可以。

更多信息:

关于java - 如何使用 for-each 循环创建一个类(不是集合的后代) "compatible"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18992132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com