在狗和主人之间建立双向关系(java)

sigwle7e  于 2021-08-20  发布在  Java
关注(0)|答案(3)|浏览(272)

我对编程非常陌生,我正在为一个狗狗拍卖项目做作业,我想写一个方法,把一条狗送给一个人。
我有一个owner类,我想在其中存储数组中的dog对象(我知道使用列表是一个选项,但是赋值指定了数组的使用)。我有一个狗类课程,我想在那里可以设置一个主人。我遇到的问题是,每当我将dog添加到owned dogs的owners数组时,我想自动设置dogs owner变量,反之亦然,如果我调用dog类中的setowner方法,我想自动将dog添加到数组中
这是我的狗课:

public class Dog{
    private String name;
    private String breed;
    private int age;
    private int weight;
    private double tailLength;
    private Owner owner;

    public Dog(String name, String breed, int age, int weight) {
            this.name = name;
            this.breed = breed;
            this.age = age;
            this.weight = weight;

    }

    public String getName() {
        return name;
    }

    public String getBreed() {
        return breed;
    }

    public void increaseAge() {
        age++;
    }

    public int getAge() {
        return age;
    }

    public int getWeight() {
        return weight;
    }

    public double getTailLength() {
        if (breed.equalsIgnoreCase("dachshund") || breed.equalsIgnoreCase("tax")) {
            return 3.7;
        } else {
            return weight * (age / 10.0);
        }
    }

   public Owner setOwner(Owner owner){
    return this.owner = owner;
   }

    public Owner getOwner(){
        return owner;
    }

    public String toString() {
        return "Name: " + name + " Breed: " + breed + " Age: " + age + " Weight: " + weight + " Tail length: " + getTailLength();
    }

}

这是所有者类:

public class Owner {

        private String ownerName;
        public Dog[] dogList = new Dog[1];

        public Owner(String ownerName) {
            this.ownerName = ownerName;
        }

        public String toString(){
            return "Name: " + ownerName;
        }

        public String getName(){
            return ownerName;
        }            

    }

最后,这是迄今为止的givedog方法:

public void giveDog(){
        System.out.print("Enter the name of the dog?>");
        String name = input.nextLine();
        Dog dog = findDog(name);

    if (dog == null){
        System.out.print("Error: No dog with that name");
    return; 
    }

    if (dog.getOwner() !=null){                    
        System.out.print("Error: Dog already has owner");
    return; 
    }

         System.out.print("Enter the name of the new owner?>");
         String nameOfOwner = input.nextLine().toUpperCase();
         Owner o = findOwner(nameOfOwner);

         if (o!= null) {

            dog.setOwner(o);
            owner.dogList[0] = dog;

             System.out.println(owner.getName()+" now owns "+ dog.getName()); 

         } else {
             System.out.print("Error: No such owner");

        } 
     }

我可以对我的代码进行哪些更改,以便将狗添加到主人或将狗添加到主人或将狗添加到主人会自动设置另一个?

yyhrrdl8

yyhrrdl81#

我建议你改变主意 Owner.dogList 是一个列表而不是数组。改变 Dog.setOwner() 致:

public void setOwner(Owner o) {
    if(this.owner != o) {
        this.owner = o;
        o.getDogList().add(this);
    }
}

打个电话就行了 dog.setOwner(o); 在你的 giveDog() 方法。

yiytaume

yiytaume2#

首先,我建议使用列表而不是数组。添加和删除项目要简单得多。
目前设置所有权的代码为:

dog.setOwner(o);
  owner.dogList[0] = dog;

你认为你能对这件事做些什么改变 Dog.setOwner() 这样你就不需要这么做了 owner.dogList[0] = dog; 打过电话之后?也就是说,放入一些代码 setOwner 这样你就可以说 dog.setOwner(o) 两个方向的关系都会建立起来吗?
以另一种方式设置关系并不是那么容易——通过直接操作所有者对象内部的数据结构,而不是调用方法,将狗交给所有者。这意味着您无处放置代码来创建关系的另一个方向。所以创造一个 Owner.addDog 方法是个好主意。
最后,一旦开始在两个位置设置双向关系,您就需要考虑避免无限递归。

eimct9ow

eimct9ow3#

你能试试这个吗
首先,修改 setOwner 方法,不仅设置所有者,而且将所有狗分配给所有者

class Dog {
    private String name;
    private String breed;
    private int age;
    private int weight;
    private double tailLength;
    private Owner owner;

    ...

    public Owner setOwner(Owner owner) {
        owner.assignDog(this);
        return this.owner = owner;
    }

    ...
}

第二,创造 assignDog 方法 Owner

class Owner {

    private String ownerName;
    public List<Dog> dogList = new ArrayList<>();

    ...

    public void assignDog(Dog dog) {
        this.dogList.add(dog);
    }

    ...

}

最后,你可以打电话 setOwner 这将设置双向关系

public class Solution {

    public static List<Dog> dogs = Arrays.asList(new Dog("Tom"));

    public static List<Owner> owners = Arrays.asList(new Owner("ALICE"));

    public static Dog findDog(String name) {
        for (Dog dog : dogs) {
            if (dog.getName().equals(name)) {
                return dog;
            }
        }
        return null;
    }

    public static Owner findOwner(String name) {
        for (Owner owner : owners) {
            if (owner.getName().equals(name)) {
                return owner;
            }
        }
        return null;
    }

    public static void main(String[] arg) {

        Scanner sc = new Scanner(System.in);

        System.out.print("Enter the name of the dog?>");
        String name = sc.nextLine();
        Dog dog = findDog(name);

        if (dog == null) {
            System.out.print("Error: No dog with that name");
            return;
        }

        if (dog.getOwner() != null) {
            System.out.print("Error: Dog already has owner");
            return;
        }

        System.out.print("Enter the name of the new owner?>");
        String nameOfOwner = sc.nextLine().toUpperCase();
        Owner o = findOwner(nameOfOwner);

        if (o != null) {

            dog.setOwner(o);
            System.out.println(o.getName() + " now owns " + dog.getName());

        } else {
            System.out.print("Error: No such owner");

        }
    }
}

相关问题