Новичок Java удаление объекта в ArrayList Java Проблема - PullRequest
1 голос
/ 22 марта 2020

Мне трудно понять, почему, когда я вызываю конкретный c объект из моего arrayList, он не возвращает желаемый результат? Меня просят создать 3 новых объекта и добавить их в массив, используя метод add, вызвать недопустимый параметр с get на 4 и действительный, равный 2, отобразить детали, затем удалить 4 и 2. Вывод, который я получаю мой основной метод -

Invalid index position
2
The current guests in Puss in Boots Cattery:
Garfield
Bob
John
Invalid index position
The current guests in Puss in Boots Cattery:
Garfield
John

Я не понимаю, почему я получаю только «2» в качестве результата вместо имени кота «Джон», в котором должно храниться значение 2?

package pkg4;

import java.util.ArrayList;

public class Cattery {  
    private ArrayList<Cat> catList;
    private String businessName;

    public Cattery(String businessName) {
        catList = new ArrayList<Cat>();
        this.businessName = businessName;
    }

    public void addCat(Cat newCat) {

        catList.add(newCat);
    }

    public void getCat(int index) {
        if ((index >= 0) && (index <= catList.size() - 1)) {
            Cat oneCat = catList.get(index);
            System.out.println(index);
        } else {
            System.out.println("Invalid index position");
        }
    }

    public void removeCat(int indexRemove) {
        if ((indexRemove >= 0) && (indexRemove <= catList.size() - 1)) {
            catList.remove(indexRemove);
        } else {
            System.out.println("Invalid index position");
        }
    }

    public void displayAllCats() {
        System.out.println("The current guests in Puss in Boots Cattery:");
        for (Cat catNames : catList) {
            System.out.println(catNames.getName());
        }
    }

    public static void main(String[] args) {
        Cattery allCats = new Cattery("Puss In Boots Cattery");
        Cat c1 = new Cat("Garfield", 2015, 10);
        Cat c2 = new Cat("Bob", 2020, 5);
        Cat c3 = new Cat("John", 2019, 9);
        allCats.addCat(c1);
        allCats.addCat(c2);
        allCats.addCat(c3);
        allCats.getCat(3);
        allCats.getCat(2);
        allCats.displayAllCats();
        allCats.removeCat(3);
        allCats.removeCat(1);
        allCats.displayAllCats();
    }
}

Класс Cat

public class Cat {
    private String name;
    private int yearOfBirth;
    private int weightInKilos;

    public Cat(String inputName, int inputYearOfBirth, int inputWeigthInKilos) {
        setName(inputName);
        setYearOfBirth(inputYearOfBirth);
        setWeigthInKilos(inputWeigthInKilos);
    }

    public String getName() {
        return name;
    }

    public int getYearOfBirth() {
        return yearOfBirth;
    }

    public int getWeightInKilos() {
        return weightInKilos;
    }

    public void setName(String name) {
        if (name != null && !name.isEmpty()) {
            this.name = name;
        } else if (name == null) {
            throw new IllegalArgumentException("name cannot be null");
        } else if (name.isEmpty()) {
            throw new IllegalArgumentException("name cannot be an empty String");
        }
    }

    public void setYearOfBirth(int yearOfBirth) {
        if (yearOfBirth > 0) {
            this.yearOfBirth = yearOfBirth;
        } else {
            throw new IllegalArgumentException("year of birth cannot be negative");
        }
    }

    public void setWeigthInKilos(int weigthInKilos) {
        if (weigthInKilos > 0) {
            this.weightInKilos = weigthInKilos;
        } else {
            throw new IllegalArgumentException(" weight in kilos cannot be negative");
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Если вы хотите напечатать объект cat, переопределите метод toString в классе Cat следующим образом:

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", yearOfBirth=" + yearOfBirth +
                ", weightInKilos=" + weightInKilos +
                '}';
    }

и обновите этот код для печати объекта cat

public void getCat(int index) {
    if ((index >= 0) && (index < catList.size())) {
        Cat oneCat = catList.get(catList.get(index));                
        System.out.println(oneCat);
    }
    else{
        System.out.println("Invalid index position");
    }
}
2 голосов
/ 22 марта 2020

вы печатаете индекс.

public void getCat(int index) {
    if ((index >= 0) && (index < catList.size())) {
        Cat oneCat = catList.get(index);                
        System.out.println(index);  // **** here ****
    }
    else{
        System.out.println("Invalid index position");
    }
}

Если вы хотите распечатать Cat, наберите System.out.println(oneCat);


Обратите внимание, что метод с самого начала имеет недостатки, так как это getter метод и поэтому он не должен печатать a Cat, а скорее return one:

public Cat getCat(int index) {
    if ((index >= 0) && (index < catList.size())) {
        Cat oneCat = catList.get(index);                
        return oneCat;
    } else{
        // you really should *throw* an exception here
    }
}

Тогда вы можете сделать это в вашем основном методе:

try {
    System.out.println(allCats.getCat(2));
} catch (IllegalArgumentException e) {
    e.printStacktrace();
}

Некоторые ключевые моменты:

  • Ваш текущий код можно разделить на логические классы, которые содержат «модель» проблем, с которыми вы имеете дело, здесь Cat и UI или классы «пользовательского интерфейса», которые имеют дело с получением информации от пользователя и возвратом информации в одни и те же
  • Ваши логические классы не должны иметь внутри себя код UI, то есть вы не должны не получать или не возвращать данные от или к пользователю в этих классах. Нет печати, нет сканера, ничего. Единственное исключение, если вы используете System.out.println в качестве временного «отладчика бедняка» - для распечатки состояния ключевых переменных во время работы программы с окончательным планом удаления этих операторов в готовом продукте
  • Пользовательский ввод и вывод должны быть отдельными в вашем классе пользовательского интерфейса или для очень простых программ, подобных этой, в методе main.
  • Любой метод getter должен сделать именно это - получить и вернуть запрашиваемый в формировании. Ваш помечен как void и распечатывает данные, что делает метод довольно бесполезным в долгосрочной перспективе.
  • Дайте логическим классам переопределение public String toString(), которое позволяет вам тестировать и выводить состояние объекта. Вначале вы будете использовать их для вывода своей программы, но позже в вашем образовании их будет больше для целей отладки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...