Добавление второго Animal сбрасывает Arraylist животных до индекса 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);
}
}
}
На данный момент я сбит с толку. Как мне добавить класс Animal в Arraylist, расположенный в Cage, и сложить в него моих Animals.
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");
}
}
Если кто-то может подтолкнуть меня в правильном направлении, это будет здорово, спасибо!
Animal, но его instaces.
cage.putAnimal(newAnimal); выдает ошибку? нежелательное поведение? ваш пост совсем непонятен ...
«Добавление второго Animal сбрасывает Arraylist животных до индекса 0» - укажите MCVE. Судя по тому, что вы показали, этого не должно происходить.
Как выглядит метод duplicatedAnimal?
@shahaf проблема, с которой я сталкиваюсь, - это когда я создаю новый объект для животных и пытаюсь добавить его в Arraylist, расположенный в классе Cage. Он добавляет животное, но когда я. Добавить. An. Новый он просто начинает заполняться с индексом 0. Таким образом, предыдущее животное больше не превосходит. Когда я использую метод find Animal в основном для поиска животных по имени, он находит только новых добавленных.
@ C.Khan, хорошо, я пытался что-то сделать с тем, что я понял до сих пор, надеюсь, это то, что вы ищете, дайте мне знать, если нет




Каждый раз, когда вы вызываете addAnimal, вы создаете новый объект Cage и добавляете новое животное в эту клетку. Чтобы добавить нескольких животных в одну клетку, метод addAnimal не может быть статическим, а клетка должна быть членом какого-то класса (AnimalKeeper?)
Что-то вроде этого
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
}
}
Спасибо, попробую :)
Я изо всех сил пытался понять, что именно вы имели в виду, реорганизовал ваш код так, чтобы он выглядел так
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, этот тип структуры имеет встроенную функцию устранения дублирования, вам придется переопределить функцию hashCode() в Animal, чтобы map знал, как хешировать каждый объект, например
@Override
public int hashCode() {
return this.name.hashCode()
}
Мой код выглядит знакомым с этой концепцией. Но мой основной метод находится в классе Zoo.java. Если я прав, то (клетка = новая клетка (1)) поместит всех животных в одну клетку, верно? Вопрос, который задает школа, звучит так. getAnimal возвращает Animal с определенным именем или null, если такого Animal нет в клетке. <- Эта часть возвращает из Arraylist в классе Cage только 1 животное, даже если я добавляю несколько животных в одну Cage c. animalInList возвращает true, если животное с указанным именем находится в клетке, или false в противном случае
@ C.Khan cage = new Cage(1) эта строка создает новую клетку и присваивает ей номер 1, все животные, которые вы добавляете с помощью cage.putAnimal(...), будут добавлены в эту клетку, я не реализовал getAnimal(), потому что я не видел его в предоставленном вами коде .. ... но вы можете реализовать это довольно легко, есть ли в вашем комментарии еще один вопрос?
с какой именно ошибкой / проблемой вы столкнулись?