首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合模式的递归迭代器

组合模式的递归迭代器
EN

Stack Overflow用户
提问于 2015-06-11 11:28:19
回答 2查看 5.7K关注 0票数 1

我有树类AbstractComponent、叶子和复合:

代码语言:javascript
复制
public abstract class AbstractComponent {
    privavte String name;

    [...]
}

public class Leaf extends AbstractComponent {
    [...]
}

public Composite extends AbstractComponent {
    private List<AbstractComponent> children;

    public void addChild(AbstractComponent a) {
        [...] 
    }

    public List<AbstractComponent> getChildren() {
        return children;
    }
}

我的问题是:如何用Java为基于复合模式的模型编写递归迭代器?我读了这个问题(创建递归迭代器)。对我的问题采用公认的答案是可能的吗?我还从番石榴中找到了TreeTraverser类,但它似乎仅限于一个表示节点的类。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-11 12:00:26

首先,在术语方面提供一些帮助。

  • 迭代器不是递归的。您要寻找的是树遍历的策略。
  • 虽然树遍历实现通常是递归的,但它们通常不会用于迭代器。
  • 组件对象的结构称为属树

1您需要选择如何遍历复合结构(即泛型树)

如果没有特定的遍历顺序需求,用户1121883解决方案是一个很好的选择,因为它很容易实现。

如果您需要执行不同的策略(例如,深度优先),请尝试以下方法

代码语言:javascript
复制
class AbstractComponent {

    public Iterator<AbstractComponent> iterator() {
        List<AbstractComponent> list = new LinkedList<AbstractComponent>();
        addAllChildren(list);
        list.add(this);
        return list.iterator();
    }

    protected abstract void addAllChildren(List<AbstractComponent> list);
}

public class Leaf extends AbstractComponent {

    //...

    protected void addAllChildren(List<AbstractComponent> list) {
        //DO NOTHING
    }
}

public class Composite extends AbstractComponent {

    //...

    protected void addAllChildren(List<AbstractComponent> list) {
        for (AbstractComponent component : children) {
            // This is where you implement your traversal strategy
            component.addAllChildren(list);
            list.add(component);
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2015-06-11 11:49:48

迭代器不是递归的。不确定我是否理解您的问题,但是结构的基本迭代器应该类似于(从这里开始的级别顺序:遍历 ):

代码语言:javascript
复制
 public class AbstractComponentIterator implements Iterator<AbstractComponent> {

    Deque<AbstractComponent> stack = new LinkedList<>();


    public AbstractComponentIterator(AbstractComponent root) {
        stack.add(root);
    }

    @Override
    public boolean hasNext() {
        return !stack.isEmpty();
    }

      @Override
    public AbstractComponent next() {
        if(stack.isEmpty()){
            throw new NoSuchElementException();
        }
        AbstractComponent node = stack.pop();
        if (node != null) { //only if Composite.children has null 
            if (node instanceof Composite) {
                Composite ac = (Composite) node;
                for (AbstractComponent acc : ac.children) { 
                    stack.add(acc);
                }
            }
        }
        return node;
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30779515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档