学习笔记20170312——JAVA解决农场母牛生baby的问题
2017-03-12 13:29
393 查看
第一次在CSDN博客上写东西,希望日积月累,终得收获。
问题:
农场一头小母牛,
母牛每年生母牛。
母牛5岁产母牛,
20年后多少牛?
PS:在这里有个前提就是,第一头母牛已经>=5岁啦~
思路脉络:
1、Object Oriented思想
❤考虑类:母牛、农场
PS:一开始可能不会想到把农场设计为一个类。但母牛是成长在农场里的,随着时间推移,农场里的母牛数量不断增长。
❤考虑属性:母牛有age、农场有oldcows群体(age >= 5) 和 newcows群体(age < 5)。
❤考虑方法:母牛可以生产小母牛:produceCow() ;农场可以得到母牛总数 :getNums()
❤考虑类之间的关系:农场的属性oldcows、newcows是母牛的对象集合
2、具体实现
❤类Cow:
❤类Farm:
❤主类:
问题反思:
1、在方法produceCow()中,我将生出的小baby设置为0岁: return new Cow(0);
2、一开始运行时会报错:java.util.ConcurrentModificationException(并发修改异常)
原因:在对newcows进行遍历的时候,并发地对它进行了remove操作
解决:在remove操作后立即执行break跳出foreach语句。
PS:可以搜索到用Iterator进行解决的几种方案,但是我都还不太熟练,因此采取了最简单的一种。
3、在for(int i=0;i<year;i++)循环中,我的几个遍历显得有些冗余。
一开始我是将母牛age的++都写到了newcows和oldcows各自的遍历当中去的,但是这样程序就会有bug:新的一年变成5岁的母牛被放入oldcows后,age再次被++。所以我进行了一些修改。
4、我参考了http://blog.csdn.net/leadseczgw01/article/details/52760806的博客,在此表示感谢!中间有不太懂的地方,所以按照自己的思路写了下来,但结果有些差异。如果大家发现错误或者有好的建议,欢迎留言!
java小嘎啦
加油
2017.3.12白【2:11】完
问题:
农场一头小母牛,
母牛每年生母牛。
母牛5岁产母牛,
20年后多少牛?
PS:在这里有个前提就是,第一头母牛已经>=5岁啦~
思路脉络:
1、Object Oriented思想
❤考虑类:母牛、农场
PS:一开始可能不会想到把农场设计为一个类。但母牛是成长在农场里的,随着时间推移,农场里的母牛数量不断增长。
❤考虑属性:母牛有age、农场有oldcows群体(age >= 5) 和 newcows群体(age < 5)。
❤考虑方法:母牛可以生产小母牛:produceCow() ;农场可以得到母牛总数 :getNums()
❤考虑类之间的关系:农场的属性oldcows、newcows是母牛的对象集合
2、具体实现
❤类Cow:
public class Cow { private int age; //母牛属性:年龄 public Cow(int age) { super(); this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Cow produceCow() { if(age >= 5) { return new Cow(0); //若母牛年龄 >= 5岁,则生产小母牛 } return null; } }
❤类Farm:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Farm { //农场的老母牛集合(age>=5)、小母牛集合(age<5) private static List<Cow> oldcows,newcows; static { oldcows = new ArrayList<>(); newcows = new ArrayList<>(); Cow cow=new Cow(5); //最初的5岁母牛 oldcows.add(cow); } //获取第year年的母牛总数 public static void getNums(int year) { for(int i=0;i<year;i++) { //到了新的一年 for(Cow cow : newcows) { cow.setAge(cow.getAge()+1); } for(Cow cow : oldcows) { cow.setAge(cow.getAge()+1); } for(Cow cow : newcows) { if(cow.getAge() >= 5) { oldcows.add(cow); newcows.remove(cow); break; //对java.util.ConcurrentModificationException的处理 } } for(Cow cow : oldcows) { Cow babycow = cow.produceCow(); newcows.add(babycow); } System.out.printf("第%d年农场有%d只母牛呢!%n", i+1, oldcows.size() + newcows.size()); } } }
❤主类:
public class Test { public static void main(String[] args) { Farm.getNums(20); } }
问题反思:
1、在方法produceCow()中,我将生出的小baby设置为0岁: return new Cow(0);
2、一开始运行时会报错:java.util.ConcurrentModificationException(并发修改异常)
原因:在对newcows进行遍历的时候,并发地对它进行了remove操作
解决:在remove操作后立即执行break跳出foreach语句。
PS:可以搜索到用Iterator进行解决的几种方案,但是我都还不太熟练,因此采取了最简单的一种。
3、在for(int i=0;i<year;i++)循环中,我的几个遍历显得有些冗余。
一开始我是将母牛age的++都写到了newcows和oldcows各自的遍历当中去的,但是这样程序就会有bug:新的一年变成5岁的母牛被放入oldcows后,age再次被++。所以我进行了一些修改。
4、我参考了http://blog.csdn.net/leadseczgw01/article/details/52760806的博客,在此表示感谢!中间有不太懂的地方,所以按照自己的思路写了下来,但结果有些差异。如果大家发现错误或者有好的建议,欢迎留言!
java小嘎啦
加油
2017.3.12白【2:11】完
相关文章推荐
- Java学习笔记37:Spring 使用 @ResponseBody 返回中文乱码问题解决
- Java 学习笔记--解决一个类实现多个接口的问题
- Java 学习笔记16:用ThreadLocal解决多线程安全问题
- 【软工学习笔记】【web开发环境】解决eclipse中web项目出现Project facet Java version 1.8 is not supported.的问题
- Java学习笔记45(多线程二:安全问题以及解决原理)
- java学习笔记---第一个applet程序以及一个小问题的解决
- Java学习笔记--解决一个类实现多个接口的问题
- JNI学习笔记5——本地方法处理java数组/引用问题/缓存jfieldID/jmethodID
- 我的嵌入式学习笔记(2)--scanf使用常见问题及解决方法
- 【记录】JS正则表达式(学习笔记2)现学现卖还帮美女解决了个问题。
- 学习笔记---递归的代码,解决经典的汉诺塔问题
- 我的嵌入式学习笔记(2)--scanf使用常见问题及解决方法
- ESXi(ESXi 4.1)相关问题解决方法和操作学习笔记
- CEGUI学习笔记六-- 使用CEGUI解决具体问题
- SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题
- CEGUI学习笔记 -- 使用CEGUI解决具体问题
- JAVA学习提高之----Propert文件不能保存中文的问题及解决
- ASP.NET学习笔记----解决页面中部分验证的问题:validationgroup,爽(20080326)
- SpringMVC学习笔记--解决乱码问题
- 【记录】正则表达式学习第3天(正则学习笔记),又解决了个实际问题。