OOP-Java.将动物对象从 main 添加到类中的数组列表中



添加第二个动物,将动物数组列表重置为索引 0。所以它容纳了最后一个进入的动物。我还把UML设计放在下面,所以它可能更容易理解我正在尝试的内容。

public class Cage {
    private int placeNr;
    private ArrayList<Animal> animals = new ArrayList<Animal>();
    public Cage(int place) {
        this.placeNr = place;
    }
    public int getCageNr() {
        return this.placeNr;
    }

    public void putAnimal(Animal animal) throws DuplicateNameException {
        if(!duplicatedAnimal(animal.getName())) {
            animals.add(animal);
        }
    }
}

在这一点上我很困惑。如何在位于 Cage 中的数组列表中添加一个动物类并将我的动物堆叠在其中。

private static void addAnimal() {
    Animal newAnimal;
    Cage cage;
    try {
        System.out.println("Name: ");
        String name = sc.next();
        System.out.println("Type: ");
        String type = sc.next();
        System.out.println("birthYear: ");
        int birthYear = sc.nextInt();
        System.out.println("Cage number: ");
        int cageNumber = sc.nextInt();
        cage = new Cage(cageNumber);
        newAnimal = new Animal(name, type, birthYear);
        cage.putAnimal(newAnimal);
    } catch (DuplicateNameException dne) {
        dne.getMessage();
    } catch (InputMismatchException ime) {
        System.out.println("Wrong input");
    }
}

如果有人能把我推向正确的方向,那将是非常棒的,谢谢!

UML:在此处输入图像描述

每次调用 addAnimal 时,您都会创建一个新的 Cage 对象并将新动物添加到该 Cage 中。要将几只动物添加到同一个笼子里,addAnimal 方法不能是静态的,笼子需要是某个类的成员(动物饲养员?

像这样的东西

public class AnimalKeeper {
  private Cage cage;
  public Cage getCage() {
      return cage;
  }
  public addAnimalToCage(Animal animal) {
      //the same method as above minus the user input
      //which needs to be done somewhere else
  }
}

我尽力弄清楚你的确切意思,重构你的代码,像这样 smth

class DuplicateNameException extends Exception {
    private String message;
    public DuplicateNameException(String message){
        this.message = message;
    }
    public String getMessage(){
        return this.message;
    }
}
class Animal {
    private String name;
    public Animal(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

class Cage {
    private int placeNr;
    private ArrayList<Animal> animals = new ArrayList<Animal>();
    public Cage(int place) {
        this.placeNr = place;
    }
    public int getCageNr() {
        return this.placeNr;
    }

    public void putAnimal(Animal animal) throws DuplicateNameException {
        if(!duplicatedAnimal(animal.getName())) {
            animals.add(animal);
        } else {
            throw new DuplicateNameException(animal.getName());
        }
    }
    private boolean duplicatedAnimal(String name) {
        for (Animal animal : animals)
            if (animal.getName().equals(name))
                return true;
        return false;
    }
    public static void main(String[] args) {
        Animal newAnimal;
        Cage cage;
        try {
            cage = new Cage(1);
            newAnimal = new Animal("Dog");
            cage.putAnimal(newAnimal);
            cage.putAnimal(new Animal("not dog"));
            cage.putAnimal(new Animal("Dog"));
        } catch (DuplicateNameException dne) {
            System.out.println(dne.getMessage());
        }
    }
} 

注意:使用此代码,您需要考虑动物名称以小写和大写的情况(在这种情况下equals将返回false(使用toLowerCase()toUpperCase()将名称规范化为共同点

您可以采取的另一个选择是使用 HashMap 对象,此结构类型内置了消除重复功能,您必须覆盖 AnimalhashCode() 函数,以便map知道如何散列每个对象,例如

@Override
public int hashCode() {
  return this.name.hashCode()
}

最新更新