【转】HeadFirst 组合模式+迭代器错误原因以及解决代码
主函数中waitress.printVegetarianMenu();
调用的代码中有 Iterator iter = allMenus.createIterator();
动态绑定到:
这时CompositeIterator中的栈初始化,并向里面添加了一个迭代器。
这时,向栈添加的迭代器为ArrayList<MenuComponent> menuComponents的迭代器,即ArrayList的iterator()。
而当开始遍历这个迭代器时,
调用这个iter.next()时,调用这段代码:
其中,如果现在遍历到的项不是叶子节点,则往栈里面push一个component.createIterator()。
此时,问题出现了,这里向栈里面添加的是CompositeIterator类型的迭代器,迭代器中的栈里为ArrayList的iterator()。
这就是造成叶子节点出现遍历多次的原因。
课本代码测试结果为:
所以,应该保证加入CompositeIterator中栈里的元素全为链表的迭代器。
解决办法:
这时,我在MenuComponent抽象类中添加方法
在其子类Menu中对其进行重写,返回它自身的链表。
在CompositeIterator迭代器中,next方法中对当前元素为非叶子节点的,采取
更改后的代码测试结果为:
问题解决了。
测试数据树结构如下图:
【转】HeadFirst 组合模式+迭代器错误原因以及解决代码的更多相关文章
- coreseek常见错误原因及解决方法
coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...
- ORA-04091错误原因与解决方法
最近工作中写了一触发器报错:ORA-04091:table XX is mutating, trigger/function may not see it. 下面通过官方文档及网友提供资料分析一下错 ...
- /usr/bin/ld: cannot find -lc错误原因及解决方法
问题解决 我在执行如下命令的时候,出现了错误. gcc -o main main.c -static -L. –lmylib Linux环境下gcc静态编译/usr/bin/ld: cannot fi ...
- 【翻译自mos文章】使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式。
使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式. 參考原文: ORA-01555 Using Automatic Undo M ...
- [转]PLS-S-00201, identifier 'CALLDEMO.GET_EMPLOYEES' must be declared 预编译错误原因及解决办法
$ proc sample9.pc SQLCHECK=SEMANTICS Pro*C/C++: Release 11.2.0.1.0 - Production on Tue Jan 8 15:18:4 ...
- SpringBoot+Shiro引起事务失效、错误原因、解决方法
一.问题今天发现用户注册的Service的事务并没有起到作用,再抛出一个RuntimeException后,并没有发生回滚,下面是调试步骤: 1.检查数据库的引擎是否是innoDB 2.启动类上是否加 ...
- javascript中出现identifier starts immediately after numeric literal错误原因以及解决方法
javascript遇到参数是字符型和数字型组合的参数就会出现这种错误,例如alert(1);可以正確輸出alert(str);就會報錯alert("str");可以正確輸出.
- 0x800a138f - JavaScript runtime error: Unable to get property 'asSorting' of undefined or null reference 错误原因以及解决办法
使用Jquery Datatables的时候也许会碰到这样的错误提示,当我们仔细的查找代码,发现引用的js文件,css文件均引用了,就是找不到他的问题所在. 这是从我们引用的js文件内部报的错. 这个 ...
- 【hadoop】 running beyond virtual memory错误原因及解决办法
问题描述: 在hadoop中运行应用,出现了running beyond virtual memory错误.提示如下: Container [pid=28920,containerID=contain ...
随机推荐
- CTF-域渗透--HTTP服务--命令注入2
开门见山 1. 启动metasploit 2. 设置参数参数选项 3. 查看最后设置后的结果 4. 启动监听 5. 使用msfvemon制作webshell 6. 开启apache服务 7. 使用ba ...
- 证书打印CSS知识点总结
需求: 1.证书内容动态填充: 2.证书背景图不要求打印,只为展示作用: 3.打印内容兼容屏幕分辨率: 实现: <!-- 外层div宽度为背景图片宽 --> <div style=& ...
- 运行roscore出现unable to contact my own server无法启动小海龟的部分故障问题解决
运行roscore后,出现下图这种情况(unable to contact my own server) 原因是找不到http://后面那些,ping不到域名或IP. 参考http://www.ros ...
- Mac系统的SVN客户端:Snail SVN 精简版
Mac系统的SVN客户端:Snail SVN 精简版 前言 本人在公司中,使用的是windows操作系统,svn客户端自然也就使用tortoise svn.但自从男朋友给我买了台macbook pro ...
- JavaScript 之 DOM 与 BOM
DOM是文档对象模型,用来获取或设置文档中标签的属性,例如获取或者设置input表单的value值. 由于DOM的操作对象是文档(Document),所以dom和浏览器没有直接关系. BOM是浏览器对 ...
- Spring Cloud Alibaba 教程 | Nacos(二)
源码解析客户端注册过程 nacos作为注册中心,包含了nacos服务端(注册中心服务)和nacos客户端,nacos注册中心服务上面一讲已经介绍过了它是一个用Java语言编写开源web项目,并且拥有自 ...
- RabbitMQ 整合 SpringCloud实战
RabbitMQ 整合 SpringCloud实战RabbitMQ 整合 SpringCloud实战rabbitmq-common 子项目rabbitmq-springcloud-consumer 子 ...
- PYTHON深度学习6.2RNN循环网络
#简单的循环网络 #-*-coding:utf-8 -*- from keras.datasets import imdbfrom keras.preprocessing import sequenc ...
- console.log和alert的区别
alert是同步的,如果不关闭弹出框,js代码就不会继续执行下去,这时候浏览器啥都干不了. console.log不会打断js的执行. 当要输出几十几百条信息的时候还是得用console.log,而且 ...
- 蓝桥杯 sine之舞(递归)
Description 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力.不妨 ...