Проблема с удалением переменных классов потомков

213
05 июля 2022, 21:40

Прототип кода - Проблема с циклом foreach для коллекции

Код - полиморфный менеджер вещей на настенной полке.

Архитектура: Есть 3 класса наследника класса Thing (Book, Magnet, Clothes). Т.е. каждый из них является потомком Thing. Это условие по полиморфизму. Класс Manager выполняет текущие операции с элементами коллекции вещей. Класс Menu - интерфейс с пользователем.

    package ThingManager;
    
    public class Book extends Thing {
        long internationalBookNumber;                                //в расшифровке ISBN жалуется на Standart
    
         Book(long internationalBookNumber, String place, String size) {
            super(place, size);
            this.internationalBookNumber = internationalBookNumber;
        }
    
         long getInternationalBookNumber() {
            return internationalBookNumber;
        }
    
         void setInternationalBookNumber(long internationalBookNumber) {
            this.internationalBookNumber = internationalBookNumber;
        }
    
        @Override
        public String toString() {
            return "K`nigga: " + internationalBookNumber ;
        }
    }

    package ThingManager;
    
    public class Clothes extends Thing {
        String size;
    
        public Clothes(String clothesSize, String place, String size) {
            super(place, size);
            this.size = clothesSize;
        }
    
        public String getSize() {
            return size;
        }
    
        public void setSize(String size) {
            this.size = size;
        }
    
        @Override
        public String toString() {
            return "Одёжа размером: " + size;
        }
    }

    package ThingManager;
    
    public class Magnet extends Thing {
        String whereItCameFrom;
    
        public Magnet(String whereItCameFrom, String place, String size) {
            super(place, size);
            this.whereItCameFrom = whereItCameFrom;
        }
    
        public String getWhereItCameFrom() {
            return whereItCameFrom;
        }
    
        public void setWhereItCameFrom(String whereItCameFrom) {
            this.whereItCameFrom = whereItCameFrom;
        }
    
        @Override
        public String toString() {
            return "Магнитик привезён из: " + whereItCameFrom;
        }
    }
    package ThingManager;
    
    import java.util.ArrayList;
    
    public class Manager {
        String place;
        String size;
        ArrayList<Thing> things;
    
        Manager() {
           things = new ArrayList<>();
        }
    
        Manager(String place, String size) {
            this.place = place;
            this.size = size;
        }
    
        void addBook(long serial, String place, String size) {
            Thing thing = new Book(serial,place, size);
            things.add(thing);
        }
    
        void addMagnet(String contry, String place, String size) {
            Thing thing = new Magnet(contry, place, size);
            things.add(thing);
        }
    
        void addClothes(String clothesSize, String place, String size) {
            Thing thing = new Clothes(clothesSize, place, size);
            things.add(thing);
        }
        void delThing(String place, String size) {
            for (Thing thing : things) {
                if ((place.equals(thing.shelfPlace)) & (size.equals(thing.thingSize))) {
                    things.remove(thing);
                    System.out.println("Что-то там удалено");
                    break;
                } else {
                    System.out.println("Нет такого.");
                    break;
                }
            }
        }
    
    }
package ThingManager;
import java.util.ArrayList;
import java.util.Scanner;
public class Menu {
    Scanner scanner;
    Manager manager;
    public static void main(String[] args) {
        Manager manager = new Manager();
        manager.addBook(978 - 5 - 6040043 - 6 - 4, "Лежит слева", "Двухтомник тех.литературы издательства культуры");
        manager.addMagnet("Польша стронг", "висит на холодосе", "с печеньку");
        manager.addClothes("XXL", "дахрензнаетгдеэтотносок", "42");
        Menu menu = new Menu(manager);
        menu.startManager();
    }

    Menu(Manager manager) {
        scanner = new Scanner(System.in);
        this.manager = manager;
    }
    int userInput() {
        int userInput;
        while (true) {
            if (scanner.hasNextInt()) {
                userInput = scanner.nextInt();
                scanner.nextLine();
                break;
            } else {
                scanner.nextLine();
            }
        }
        return userInput;
    }

    void startManager() {
        int userInput;
        String[] options = {
                "1 - Показать всё",
                "2 - добавить книжку",
                "3 - добавить магнитик",
                "4 - добавить одёжу",
                "5 - удалить какой-нибудь объект",
                "6 - удалить все",

                "8 - для возврата в меню",
                "9 - для выхода"
        };
        do {
            System.out.println("Выберите вариант: ");
            for (String option : options) {
                System.out.println(option);
            }
            userInput = scanner.nextInt();
            scanner.nextLine();
            processing(userInput);
        } while (userInput() != 9);
        System.out.println("Работа завершена.");
    }
    private void processing(int userInput) {
        switch (userInput) {
            case 1:
                showAnything();
                break;
            case 2:
                menuAddBook();
                break;
            case 3:
                menuAddMagnet();
                break;
            case 4:
                menuAddClothes();
                break;
            case 5:
                menuDelOneThing();
                break;
            case 6:
                menuDelAnything();
                break;
            case 8:
                break;
            case 9:
                return;
        }
    }
    void menuAddBook() {
        System.out.println("Введите серийник: ");
        long serial = scanner.nextLong();
        System.out.println("Введите место: ");
        String place = scanner.nextLine();
        System.out.println("Введите размер: ");
        String size = scanner.nextLine();
        manager.addBook(serial, place, size);
        System.out.println("Добавлено в библиотЭку");
    }
    void menuAddMagnet() {
        System.out.println("Введите откуда привезено: ");
        String country = scanner.nextLine();
        System.out.println("Введите место: ");
        String place = scanner.nextLine();
        System.out.println("Введите размер: ");
        String size = scanner.nextLine();
        manager.addMagnet(country, place, size);
        System.out.println("Повешено на холодос");
    }
    void menuAddClothes() {
        System.out.println("Введите размер одёжы: ");
        String ClothesSize = scanner.nextLine();
        System.out.println("Введите место: ");
        String place = scanner.nextLine();
        System.out.println("Введите размер: ");
        String size = scanner.nextLine();
        manager.addClothes(ClothesSize, place, size);
        System.out.println("Куда-то кинуто");
    }
    void menuDelOneThing() {
        System.out.println("Введите положение объекта для удаления: ");
        String place = scanner.nextLine();
        System.out.println("Введите размер объекта для удаления: ");
        String size = scanner.nextLine();
        manager.delThing(place, size);
    }
    void menuDelAnything() {
        for (Thing thing : manager.things) {
            manager.things.remove(thing);
        }
    }
    void showAnything() {
        for (Thing thing : manager.things) {
            System.out.println(thing);
        }
    }

}
package ThingManager;
public class Thing {
    String shelfPlace;                  //  Место на полке
    String thingSize;                      //  Размер вещи
    public Thing() {
    }
    public Thing(String Place, String Size) {
        this.shelfPlace = Place;
        this.thingSize = Size;
    }
    public String getShelfPlace() {
        return shelfPlace;
    }
    public void setShelfPlace(String shelfPlace) {
        this.shelfPlace = shelfPlace;
    }
    public String getThingSize() {
        return thingSize;
    }
    public void setThingSize(String thingSize) {
        this.thingSize = thingSize;
    }
    @Override
    public String toString() {
        return "Thing{" +
                "ShelfPlace='" + shelfPlace + '\'' +
                ", thingSize=" + thingSize +
                '}';
    }
}

Вопросы:

  1. почему не работает метод удаления ВСЕХ элементов коллекции void menuDelAnything() { класса Menu

Код ошибки:

   Exception in thread "main" java.util.ConcurrentModificationException
        at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
        at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
  1. Почему не работает метод удаления ОДНОГО предмета коллекции void menuDelOneThing() { класса Menu. Проверялось на manager.addBook(1,"q","w");
READ ALSO
HQL-запрос к Базе Данных работает не корректно с OneToMany

HQL-запрос к Базе Данных работает не корректно с OneToMany

У меня есть две сущности: Customer и CustomerOrderЗависимость между ними One-to-Many

150
Как получить размер экрана в пикселях в android?

Как получить размер экрана в пикселях в android?

Мне нужно получить ширину и высоту экрана на устройстве, на котором сейчас выполняется приложениеКак мне это сделать?

241
Как дождаться выполнение асинхронного метода?

Как дождаться выполнение асинхронного метода?

Как мне дождаться выполнение асинхронного метода? Есть такой метод ServergetData(DataListener listener); Данные загружаются в отдельном потоке, и по завершению...

237