Java

JAVA, почему программа входит в бесконечный loop

Public class Solution {
public static void main(String[] args) {
ArrayList strings = new ArrayList();
strings.add("роза");
strings.add("лоза");
strings.add("лира");
strings = fix(strings);

for (String string : strings) {
System.out.println(string);
}
}

/* ПОЯСНЕНИЕ:
Метод Fix, который должен удалить слово, если в нем есть Р,
и скопировать, если в нем есть Л.
Я хочу, чтобы после удаления слова ( т. к. арей сдвигается ), for прошелся по следующему
if с тем же индексом. Т. е. я хочу, чтобы i-- произошло один раз, но он входит в бесконечный луп */

public static ArrayList fix(ArrayList strings) {
for( int i = 0; i < strings.size() -1; i++ ){
String str = strings.get(i);
if ( str.contains("р") ) {
strings.remove(str);
i--;
}
if ( str.contains("л") ) strings.add(i, str);
}
return strings;
}
}
Ivan Covas
Ivan Covas
25
а ты распечатывай i и поймёшь куда ведут твои безобразия с изменением переменной цикла...
что у тебя произойдёт при обработке первого слова в списке?
чему станет равна переменная i?
ЕСЛИ блок для проверки на содержание буквы "л" будет пытаться проверить удалённое слово, которого не существует...

что сделает твоя программа со словами в которых нет этих двух букв?
что сделает твоя программа, если в слове есть и "р" и "л"?...

будь проще... сделай новый пустой список... и добавляй в его слово когда условие подходит и нужное количество раз...
Алексей Пашков
Алексей Пашков
96 903
Лучший ответ
Попробуй ретурн закоментить
Ivan Covas return должен остаться, метод должен возвращать массив
1) роза у вас идет первым елементом,
текущий i=0, первый if удаляет роза, (осталось два елемента лоза, лира), текущий елемент уходит в -1.
2) следущая итерация, i=0 (-1+1), второй If создает 'лоза' первым елементом (0) в массиве (лоза (новая), лоза, лира). остальные смещаются вправо.
3) сл. итерация. i=1, второй иф создает во втором елементе массива опять (лоза). (лоза, лоза (новая), лоза, лира)
4) сл. итерация. i=2.
(лоза, лоза, лоза (новая), лоза, лира)
... как вы видите infinitive loop

если брать ваш алгоритм, то добавление слова, надо бы делать за провеочным словом, и соответсвенно прокучивить i:
if ( str.contains("л") ) { i++; strings.add(i, str);}

еще у вас ошибка в цикле: i < strings.size() -1 (чем это вам последний елемент не угодил?)
vs
i < strings.size()
SS
Sasha Sokolov
2 543
луп-залуп
Сергей Дианов
Сергей Дианов
1 411