package com.javarush.task.task07.task0716;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
Р или Л
*/
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
ArrayList<String> list = new ArrayList<String>();
list.add("роза"); //0
list.add("лоза"); //1
list.add("лира"); //2
list = fix(list);
for (String s : list) {
System.out.println(s);
}
}
public static ArrayList<String> fix(ArrayList<String> list) {
for (String s : list){
if (s.contains("р") && s.contains("л")) continue;
else if (s.contains("р") && !s.contains("л")) {
list.remove(s);
}
else if (!s.contains("р") && s.contains("л")){
list.add(s);
}
}
//напишите тут ваш код
return list;
}
}
Иван Зубов
31 уровень
Не могу найти ошибку, программа не запускается
Обсуждается
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Игорь Team Lead
24 июля 2018, 14:53
Проще решить используя цикл for с переменной " i "
2.1. удалять из списка строк все слова, содержащие букву "р" - после удаления элемента декрементируй " i " ( i-- )
2.2. удваивать все слова содержащие букву "л" - добавляй слово по позиции " i " и инкременть " i " ( i++ )
0
Иван Зубов
24 июля 2018, 16:44
Объясни пожалуйста для чего это необходимо сделать?
0
Игорь Team Lead
25 июля 2018, 14:24
Делая проход по "листу" в цикле for ты меняешь количество элементов / делаешь вставку в нужную позицию это изменяет индекс элемента. Без коррекции итератора возможен как выход за пределы листа, так и проскакивание
0
MrMasterIx
28 июля 2018, 20:27
да, только если декрементировать, то если удалённый элемент имел индекс 0, то 0-1, получится -1 индекс и программа упадёт с ошибкой.
0
MrMasterIx
28 июля 2018, 20:39
всё..я сообразил, такая ошибка как я описал возникала у меня потому что я делал 2 отдельных if, сначала с remove, потом с вставкой, если блок кода со вставкой писать до remove или использовать else if, то такой ошибки не будет.
Проблема была в том, что я удалял сначала "розу" (с индексом 0), потом декрементировал индекс и получал индекс -1, а потом у меня шёл блок кода с вставкой и использованием индекса -1 и программа, естественно, падала с ошибкой, а так в принципе да, программа решается циклом for и декрементом/инкрементом
0
--------Master
24 июля 2018, 14:46
Программа запускается, но уже в процессе работы падает с исключением: нельзя одновременно перебирать коллекцию итератором (циклом for) и из нее же удалять элементы в обход этого итератора.
Решения проблемы - перебор копии коллекции с удалением из оригинала, использование счетчика, а не итератора, использование итератора напрямую с собственным методом remove.
+2