「 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 回出力したようです...なぜそうなったのでしょうか? 私のコードの問題は何ですか... 再帰アルゴリズムを間違えたのでしょうか? ありがとう