资讯专栏INFORMATION COLUMN

面向对象思想 解决农场母牛生小牛问题

waterc / 560人阅读

摘要:问题农场一头小母牛,母牛每年生母牛。母牛岁产母牛,年后多少牛前提第一头母牛已经岁思路脉络面向对象基本思想,注意状态和行为,抽象出对应的属性和方法思想考虑类母牛农场一开始可能不会想到把农场设计为一个类。

问题:

农场一头小母牛,

母牛每年生母牛。

母牛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 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= 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语句。

3、在for(int i=0;i

  一开始是将母牛age的++都写到了newcows和oldcows各自的遍历当中去的,但是这样程序就会有bug:新的一年变成5岁的母牛被放入oldcows后,age再次被++。所以要进行一些修改。

引自:
https://blog.csdn.net/ac2017f...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76102.html

相关文章

  • 小牛市启示录:有价值何必等风来

    摘要:很多人将这一波的上涨解读为比特币小牛市的到来,无论从技术层面还是从消息层面来看,比特币都有逐步回暖的迹象。到日,关于英雄链网络诈骗案被破获的报道便铺天盖地地传播开来。 摘要:不在风口上,长了翅膀的项目同样可以起飞,价值终究会超越时间。 showImg(https://segmentfault.com/img/bVbrS0N?w=4096&h=3575); 自四月初以来,比特币就开启了起...

    xiaoqibTn 评论0 收藏0
  • 小牛市启示录:有价值何必等风来

    摘要:很多人将这一波的上涨解读为比特币小牛市的到来,无论从技术层面还是从消息层面来看,比特币都有逐步回暖的迹象。到日,关于英雄链网络诈骗案被破获的报道便铺天盖地地传播开来。 摘要:不在风口上,长了翅膀的项目同样可以起飞,价值终究会超越时间。 showImg(https://segmentfault.com/img/bVbrS0N?w=4096&h=3575); 自四月初以来,比特币就开启了起...

    cartoon 评论0 收藏0
  • 学习Python的建议

    摘要:如果初学者接触的第一门语言是,学习曲线则会平滑得多,掌握一些基本语法和内置的数据结构,已经可以上手写一些小工具或者小型应用。如果你的学习时间充足,我的建议是一定要学数据结构和算法。 前言 Python是最容易入门的编程语言,没有之一。如果初学者接触的第一门语言是C或者C++,对他们来说最难的不是语法,而是容易出现内存泄漏、指针等问题。有时候排查这些问题对初学者的打击很大,尤其是没掌握排...

    eechen 评论0 收藏0
  • 史上最奇葩的5种编程语言,有的甚至模拟奶牛

    摘要:编者按本文作者为,主要介绍世上最怪异最难用的种编程语言。这些语言被称为极品编程语言。创造它们的原因通常是为了测试编程语言设计的临界,或者只是一个玩笑。就是母牛的编程语言设计时充分考虑了母牛的想法。 【编者按】本文作者为 Deepak Karanth,主要介绍世上最怪异、最难用的5种编程语言。文章系国内 ITOM 管理平台 OneAPM 编译呈现。 最难学编程语言有哪些?很多人都用过Ja...

    LdhAndroid 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<