ООП-Java. Добавление объектов Animal в Arraylist в классе из основного

Добавление второго 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");
    }
}

Если кто-то может подтолкнуть меня в правильном направлении, это будет здорово, спасибо!

UML: введите описание изображения здесь

с какой именно ошибкой / проблемой вы столкнулись?

shahaf 11.04.2018 22:37
"Как мне добавить класс Animal в Arraylist" вы делаете нет добавляете классAnimal, но его instaces.
Timothy Truckle 11.04.2018 22:37

cage.putAnimal(newAnimal); выдает ошибку? нежелательное поведение? ваш пост совсем непонятен ...

shahaf 11.04.2018 22:40

«Добавление второго Animal сбрасывает Arraylist животных до индекса 0» - укажите MCVE. Судя по тому, что вы показали, этого не должно происходить.

Turing85 11.04.2018 22:47

Как выглядит метод duplicatedAnimal?

Beri 11.04.2018 23:11

@shahaf проблема, с которой я сталкиваюсь, - это когда я создаю новый объект для животных и пытаюсь добавить его в Arraylist, расположенный в классе Cage. Он добавляет животное, но когда я. Добавить. An. Новый он просто начинает заполняться с индексом 0. Таким образом, предыдущее животное больше не превосходит. Когда я использую метод find Animal в основном для поиска животных по имени, он находит только новых добавленных.

C. Khan 12.04.2018 13:04

@ C.Khan, хорошо, я пытался что-то сделать с тем, что я понял до сих пор, надеюсь, это то, что вы ищете, дайте мне знать, если нет

shahaf 12.04.2018 15:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
825
2

Ответы 2

Каждый раз, когда вы вызываете 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
  }
}

Спасибо, попробую :)

C. Khan 12.04.2018 13:09

Я изо всех сил пытался понять, что именно вы имели в виду, реорганизовал ваш код так, чтобы он выглядел так

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 12.04.2018 23:28

@ C.Khan cage = new Cage(1) эта строка создает новую клетку и присваивает ей номер 1, все животные, которые вы добавляете с помощью cage.putAnimal(...), будут добавлены в эту клетку, я не реализовал getAnimal(), потому что я не видел его в предоставленном вами коде .. ... но вы можете реализовать это довольно легко, есть ли в вашем комментарии еще один вопрос?

shahaf 13.04.2018 09:11

Другие вопросы по теме