Проблема с итерацией в цикле

Есть некоторая коллекция(исходник: Проблема с удалением переменных классов потомков):

public class Manager {
    String place;
    String size;
    ArrayList<Thing> things;

public class Thing {
    String shelfPlace;                  //  Место на полке
    String thingSize;                      //  Размер вещи

Есть реализованный метод. Метод через FOREACH:

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;
        }
    }
}

ВОПРОС: Как реализовать его через FORi ?

Непонятно какая структура получится при выводе и шаг итерации. Вот что есть:

    void delThing(String place, String size) {
    for (int i = things.size() - 1; i >= 0; i--) {
        if ((place.equals(things.get(i))) && (size.equals(things.get(i)))) {       //непонятно что из себя представляет массив и с каким элекментом работатью.
            things.remove(things.get(i));
            System.out.println("Что-то там удалено");
            break;
        } else {
            System.out.println("Нет такого.");
            break;
        }
    }
}

В попытке вывести код через sout, получил:

Exception in thread "main" java.lang.ArrayStoreException: arraycopy: element type mismatch: can not cast one of the elements of java.lang.Object[] to the type of the destination array, java.lang.String
at java.base/java.lang.System.arraycopy(Native Method)
at java.base/java.util.ArrayList.toArray(ArrayList.java:401)
at ThingManager.Manager.delThing(Manager.java:40)

Ответы (1 шт):

Автор решения: Andrew

Вот перевод ошибки (вольный):

 element type mismatch: can not cast one of the elements of java.lang.Object[] to the type of the destination array, java.lang.String

несоответствуют типы: нельзя привести один из элементов массива к типу целевого массива

Если брать именно код который приводит к ошибке и разобрать его:

for (int i = things.size() - 1; i >= 0; i--) {
        if ((place.equals(things.get(i))) && (size.equals(things.get(i)))) {  
            ....
    }

По поводу самого порядка перебора сказать ничего не могу, вам виднее как это делать. Я только укажу на проблему из-за которой походу все падает:

если(место(String).соответствует(массив объектов класса(Thing).взять(элемент i)) и размер(String).соответствует(массив объектов класса(Thing).взять(элемент i)))

то есть по факту вы пытаетесь сравнить класс со строкой, а это как-бы не очень правильно. В вашем массиве реализуйте взятие элемента из массива:

for (int i = things.size() - 1; i >= 0; i--) {
Thing thing = things.get(i);
        if ((place.equals(thing.getshelfPlace())) && (size.equals(things.get thingSize()))) {  
            things.remove(things.get(i));
            System.out.println("Что-то там удалено");
            break;
        } else {
            System.out.println("Нет такого.");
            break;
        }
}

думаю после этого исправления ошибка пропадёт. И добавьте больше уточняющей информации в вопрос пожалуйста.

→ Ссылка