0

「 Head First Design Pattern 」を読んでいましたが、369 ページの構成パターンのコードの一部で行き詰まりました。構造は構成パターンで設計され、反復子パターンを通過します。

CompositeIterator のコア アルゴリズム コードは次のとおりです。

public boolean hasNext() {
    // TODO Auto-generated method stub
    if (itemStack.size() == 0) {
        return false;
    } else {
        Iterator<MenuComponent> iter = itemStack.peek();
        if (!iter.hasNext()) {
            itemStack.pop();
            return hasNext();
        } else {
            return true;
        }
    }
}
public MenuComponent next() {
    // TODO Auto-generated method stub
    if (hasNext()) {
        Iterator<MenuComponent> iter = this.itemStack.peek();
        MenuComponent mc = iter.next();
        if (mc instanceof Menu) {
            itemStack.push(mc.createIterator());
        }
        return mc;
    } else {
        return null;
    }
}

印刷機能は次のとおりです。

public void printAll(){
    Iterator<MenuComponent> iter=menus.createIterator();
    while(iter.hasNext()){
        MenuComponent mc=iter.next();
        System.out.println(mc.getName()+" "+mc.getDescription());
    }
}

そして、コード付きのメイン関数は次のとおりです。

    Menu m1 = new Menu("aaa", "a");
    Menu m2 = new Menu("bbb", "b");
    Menu m3 = new Menu("ccc", "c");

    Menu all=new Menu("all", "all");
    all.add(m1);
    m1.add(m2);
    m2.add(m3);
    Waitress w=new Waitress(all);
    w.printAll();

それらすべてを印刷しようとすると、結果は次のようになります。

a aaa

b bbb

c ccc

c ccc

イテレータが allmenu 項目を無視して m3 を 2 回出力したようです...なぜそうなったのでしょうか? 私のコードの問題は何ですか... 再帰アルゴリズムを間違えたのでしょうか? ありがとう

4

0 に答える 0