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

363
25 июля 2022, 01:00

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

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)
Answer 1

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

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

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

READ ALSO
Динамический выпадающий список с данными из mysql на php

Динамический выпадающий список с данными из mysql на php

Помогите реализовать задачу, иметься таблица в базе данных

393
Зачем на нужны join если есть where?

Зачем на нужны join если есть where?

Учу sql заново, и у меня возник вопрос зачем вообще нужны джоиныОбъеденить таблицы ведь можно с помощью фореина и праймари ключей в таблицах...

298
Qt, C++ захват ссылки в асинхронной лямбде

Qt, C++ захват ссылки в асинхронной лямбде

Насколько безопасно так делать?

401
Чтение com портов на С++

Чтение com портов на С++

Есть ардуина и подключенный к ней датчик (какой, роли не играет) он подает данные на ардуино, а она соответственно на пкМне нужно написать...

343