学习笔记20170312——JAVA解决农场母牛生baby的问题

第一次在CSDN博客上写东西,希望日积月累,终得收获。


问题:

农场一头小母牛,

母牛每年生母牛。

母牛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】完

                                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值