农场有头大母牛,每年生头小母牛,小母牛五年后生小母牛,年龄大于15便死亡 ,问20年后农场一共有多少头牛?(使用面向对象编程思维解答)
面向过程:
public static void main(String[] args){
//所有牛的集合
List<Integer> cowAgeList = new ArrayList<>();
//添加第一只5岁的大母牛
cowAgeList.add(5);
//循环20年
for(int i=0;i<20;i++){
int count_new = 0;//当年新生数量
int count_dead = 0;//当年死亡数量
//当年新生的集合
List<Integer> cowChild = new ArrayList<>();
//遍历当年所有母牛,年龄自增、看看生不生
for(int index=0;index<cowAgeList.size();index++){
//新的一年,加一岁
int age = cowAgeList.get(index) + 1;
//将新年龄设置回集合中
cowAgeList.set(index,age);
//看下这头母牛是否该GameOver了
if(age>15){
count_dead++;
continue;
}
//试下生只小母牛吧,生不生的出来说不准(看年龄)
Integer cowNew = produce(age);
//哎,如果还生出来了,那咱们就挪窝到当年新生牛犊(不是牛肚哈)集合中
if(cowNew!=null){
count_new++;
//这里有个小细节,容易出错,我开始就想,直接把新生小母牛放到所有牛集合中不就行了,
//为啥非得先放到当年新生小母牛集合中,后面再统一放到所有牛集合中,你先想下这个问题
//咱们后面再说为什么需要这么做
cowChild.add(cowNew);
}
}
//今年生牛这个过程结束了,然后再把新生小母牛都放到所有牛集合中
cowAgeList.addAll(cowChild);
//我们上面说到为什么不直接把新生的小母牛直接放到所有牛集合中
//因为如果把新新生小母牛直接放到所有牛集合中,
// 那么当年这个新生的小母牛就会在后面的遍历中再次遍历一次
//新生的小母牛年龄是0吧,直接放到所有牛集合中,
// 新生小母牛年龄就也自增了,这不是我们想要的
System.out.println(String.format("第%d年,出生:%d,死亡:%s",i,count_new,count_dead));
}
//使用迭代器移除已经死亡的母牛,剩下的就是20年后所有存活的母牛了
Iterator<Integer> iterator = cowAgeList.iterator();
while(iterator.hasNext()){
if(iterator.next().intValue()>15){
iterator.remove();
}
}
System.out.println(String.format("20年后农场存活牛的数量为:%d",cowAgeList.size()));
}
/**
* 根据母牛年龄生产小母牛
* @param age-母牛年龄
* @return 新生小牛年龄(null表示没有生)
*/
private static Integer produce(int age){
if(age>=5 && age<=15){
return 0;
}
return null;
}
面向对象:
牛的对象:
/**
* 这是头牛
*
* @Date: 2019/7/26
*/
public class Cow {
/**
* 年龄
*/
private int age;
/**
* 是否活者
*/
private boolean alive = true;
public Cow(int age) {
this.age = age;
}
/**
* 生牛动作
* 是否能生的出来,得看年龄
*
* @return
*/
public Cow produceCow() {
if (this.age < 5 || !this.isAlive()) {
return null;
}
return new Cow(0);
}
/**
* 每年长一岁
*/
public void addAge() {
this.age += 1;
//年龄大于15就挂掉
if (this.age > 15) {
this.alive = false;
}
}
public boolean isAlive() {
return alive;
}
}
农场对象:
import java.util.ArrayList;
import java.util.List;
/**
* 这就是一个农场
*
* @Date: 2019/7/26
*/
public class Farm {
//农场里所有牛的集合
private List<Cow> cowList = new ArrayList<>();
public Farm() {
}
public List<Cow> getCowList() {
return cowList;
}
public void setCowList(List<Cow> cowList) {
this.cowList = cowList;
}
}
上帝角色(主宰一切):
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
*/
public class Main {
/**
* 这里是上帝角色,控制着一切
* @param args
*/
public static void main(String[] args) {
//实例化农场
Farm farm = new Farm();
//实例出来第一头母牛
Cow cow = new Cow(5);
//将第一只牛放到农场里面
farm.getCowList().add(cow);
for(int year=0;year<20;year++){
int count_dead = 0;//死亡数量
List<Cow> cowChilds = new ArrayList<>();
for(Cow cowTemp:farm.getCowList()){
cowTemp.addAge();
Cow child = cowTemp.produceCow();
if(child!=null){
cowChilds.add(child);
}
if(!cowTemp.isAlive()){
count_dead++;
}
}
farm.getCowList().addAll(cowChilds);
System.out.println(String.format("第%d年,出生:%d,死亡:%d",year,cowChilds.size(),count_dead));
}
//移除已经死亡的牛
Iterator<Cow> iterator = farm.getCowList().iterator();
while(iterator.hasNext()){
if(!iterator.next().isAlive()){
iterator.remove();
}
}
System.out.println(String.format("20年后农场存活牛的数量为:%d",farm.getCowList().size()));
}
}
[elementor-template id="6632"]1231sds
0 条评论