昨天我帮助一位网友解决了用Java编程模拟主人与狗的关系,我在编写代码过程中觉得这个很有趣,所以今天我想和大家分享一下。
问题是这样的:用Java编程模拟主人与狗的关系,主人能找到自己的小狗,小狗能找到自己的主人,小狗能讨好主人,这个是初级版本,还有一个升级版本,就是在初级版本上添加了这些条件:一个主人能养多只小狗(但是每个主人养的小狗数量是有限的),主人能转让自己的任意一条小狗(没有的话就不能转让),新主人可以接收小狗(新主人收养小狗的数量满了就不能接收了)
首先让我先分析一下初级版本的题目:看完这题目,我们发现就只有主人和小狗,
小狗的特点:有主人,能找到主人,能讨好主人,当然它也有自己的名称和类型;
主人的特点:有小狗,能找到小狗,当然主人也有自己的名称。
我们从上面的主人和小狗的特点中发现小狗中有主人的实例,主人中有小狗的实例(这种关系就是关联关系)。
依据这些特点我创建了Dog类
public class Dog {
? ?//小狗的名称
? ?private String name;
? ?//小狗的种类
? ?private String type;
? ?//小狗的主人
? ?private People master;
? ?//方法:讨好主人
? ?public void happy() {
? ? ? ?System.out.println(name + "讨好主人" + master.getName());
? }
?
? ?//显示小狗的信息
? ?@Override
? ?public String toString() {
? ? ? ?return "小狗:" + name + "类型:"+type+"主人是:" + master.getName();
? }
}
People类
public class People {
? ?//主人的名称
? ?private String name;
? ?//主人的宠物
? ?private Dog pet;
? ?//显示主人的信息
? ?@Override
? ?public String toString() {
? ? ? ?return "主人:" + name + "有一条狗叫" + pet.getName()
+ "品种是" + pet.getType();
? }
}
测试:
public static void main(String[] args) {
? ? ? ?//创建一个小狗对象
? ? ? ?Dog dog=new Dog("二哈","哈士奇");
? ? ? ?//创建一个主人对象
? ? ? ?People master=new People("coco");
? ? ? ?//设置小狗的主人
? ? ? ?dog.setMaster(master);
? ? ? ?//设置主人的小狗
? ? ? ?master.setPet(dog);
? ? ? ?//小狗讨好主人
? ? ? ?dog.happy();
? ? ? ?//显示信息
? ? ? ?System.out.println(dog);
? ? ? ?System.out.println(master);
? }
分析升级版问题:从升级版的问题来看,Dog类没有改变,只是People类改变了。
改变后的主人的特点:能养多条小狗,能够转让小狗,能够接收小狗,当然主人也有自己的姓名。
依照这些特点我们创建了People类,由于每个主人养的小狗的数量可能相同也可能不同,所以我们不能写一个固定长度的“小狗数组”(我这里在setDogNumber的方法中对数组初始化,当然如果大家想在创建对象时对数组初始化也可以,在构造器中对数组进行初始化)
public class People {
? ?//主人的名称
? ?private String name;
? ?//主人的宠物
? ?private Dog[] pet;
? ?//宠物个数
? ?private int dogNumber;
? ?//初始化数组
? ? public void setDogNumber(int dogNumber) {
? ? ? ?this.dogNumber = dogNumber;
? ? ? ?pet = new Dog[dogNumber];
? }
? ? //显示主人的信息
? ?@Override
? ?public String toString() {
? ? ? ?return "主人:" + name + "可以有" + dogNumber + "条狗";
? }
转让小狗:思路是先判断主人是否养的有小狗,再看主人是否有要转让的小狗,这里转让小狗(删除小狗)的操作是基于数组的拷贝,注意数组拷贝完后要把数组的最后一位设置位null。
//转让小狗
public boolean transfer(Dog d) {
//判断主人是否有小狗
if (Objects.nonNull(pet)) {
? ?for (int i = 0; i < pet.length; i++) {
? ? ? ?Dog g = pet[i];
? ? ? ? //看主人是否有要转让的小狗
? ? ? ? if (Objects.equals(g, d)) {
? ? ? ? ??//转让小狗
? ? ? ? ? System.arraycopy(pet, i + 1, pet, i, pet.length - 1 - i);
? ? ? ? ? //把数组的最后一位设置位null
? ? ? ? ? pet[pet.length - 1] = null;
? ? ? ? ? return true;
? ? ? ? ? }
? ? ? ?}
? ? }
? ? return false;
}
接收小狗:思路是判断主人还能养多余的小狗(添加小狗)
//接受小狗
? ?public boolean receive(Dog d) {
? ? ? ?for (int i = 0; i < pet.length; i++) {
? ? ? ? ? ?Dog g = pet[i];
? ? ? ? ? ?if (Objects.isNull(g)) {
? ? ? ? ? ? ? ?pet[i] = d;
? ? ? ? ? ? ? ?return true;
? ? ? ? ? }
? ? ? }
? ? ? ?return false;
? }
测试:
//为小狗设置主人,为主人设置小狗 ?
public static void recognize(People master, Dog dog) {
? ? ? ?master.receive(dog);
? ? ? ?dog.setMaster(master);
? }
//转让
public static void zhuanRang(People master1, Dog dog, People master2) {
? ? ? ?if (master1.transfer(dog)) {
? ? ? ? ? ?if (master2.receive(dog)) {
? ? ? ? ? ? ? ?System.out.println(master1.getName() + "将"
+ dog.getName() + "转让给" + master2.getName());
? ? ? ? ? } else {
? ? ? ? ? ? ? ?System.out.println("转让失败");
? ? ? ? ? }
? ? ? } else {
? ? ? ? ? ?System.out.println("转让失败");
? ? ? }
?
? }
//显示
public static void showDog(People master) {
? ? ? ?System.out.println("名称是:");
? ? ? ?for (Dog dog : master.getPet()) {
? ? ? ? ? ?if (Objects.nonNull(dog)) {
? ? ? ? ? ? ? ?System.out.print(dog.getName() + "\t");
? ? ? ? ? }
? ? ? }
? ? ? ?System.out.println();
? }
public static void test() {
? ? ? ?People master1 = new People("merry");
? ? ? ?master1.setDogNumber(3);
? ? ? ?People master2 = new People("jack");
? ? ? ?master2.setDogNumber(2);
? ? ? ?Dog dog1 = new Dog("小花", "哈士奇");
? ? ? ?Dog dog2 = new Dog("小黄", "泰迪");
? ? ? ?Dog dog3 = new Dog("小红", "哈士奇");
? ? ? ?Dog dog4 = new Dog("花花", "金巴");
? ? ? ?recognize(master1, dog1);
? ? ? ?recognize(master1, dog2);
? ? ? ?recognize(master1, dog3);
? ? ? ?recognize(master2, dog4);
? ? ? ?System.out.println(master1);
? ? ? ?showDog(master1);
? ? ? ?System.out.println(dog1);
? ? ? ?System.out.println(master2);
? ? ? ?showDog(master2);
? ? ? ?System.out.println(dog4);
? ? ? ?zhuanRang(master1, dog2, master2);
? ? ? ?zhuanRang(master2, dog4, master1);
? }
总结:
主人与狗的关系是关联关系:在一个类中将另一个类的对象作为成员变量声明。这个问题的简单版:只需要我们懂得主人与狗的关系是关联关系,就能轻松解决。问题的升级版:我们只需要向People类中加入转让和接收的方法就行,转让只要我们懂得数组拷贝就能解决不过要注意拷贝完后要把数组最后一位设置为null,接收小狗需要判断数组是否已满,对于主人能养宠物数目的初始化操作,可以在构造器中初始化,也可以在setDogNumber(int dogNumber)中初始化。
|