package com.javarush.task.task07.task0716;
import java.util.ArrayList;
/*
Р или Л
1. Создай список слов, заполни его самостоятельно.
2. Метод fix должен:
2.1. удалять из списка строк все слова, содержащие букву "р"
2.2. удваивать все слова содержащие букву "л".
2.3. если слово содержит и букву "р" и букву "л", то оставить это слово без изменений.
2.4. с другими словами ничего не делать.
*/
public class Solution {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<String>();
strings.add("роза");
strings.add("лоза");
strings.add("лира");
strings = fix(strings);
for (String string : strings) {
System.out.println(string);
}
}
public static ArrayList<String> fix(ArrayList<String> strings) {
//напишите тут ваш код
String buffer; // буферная строка
int i;
for (i = 0; i < strings.size(); i++) {
buffer = strings.get(i); // взятие строки для преобразования в char
ArrayList<Character> chars = new ArrayList<Character>(); // создание char листа
for (char c : buffer.toCharArray()) { // преобразование строки в char
chars.add(c); // добавление букв в лист chars
}
int j;
for (j = 0; j < chars.size(); j++) { // пробегаем по буквам char
if (chars.get(j) == 'р') { // если равно р , то запускаем дополнительную проверку
int k; // доп проверка
for (k = j; k < chars.size(); k++) {
if (chars.get(k) == 'л') break; // если и "р" и "л" - пропуск
else strings.remove(i); // удаление элемента ,если не нашли "л"
}
}
else if (chars.get(j) == 'л') { // если равно л , то запускаем доп проверку
int k; // доп проверка
for (k = j; k < chars.size(); k++) {
if (chars.get(k) == 'р') break; // если и "р" и "л" - пропуск
else strings.add(i, buffer); // дублируем элемент ,если не нашли "р"
}
}
}
}
return strings;
}
}
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.remove(ArrayList.java:496)
at com.javarush.task.task07.task0716.Solution.fix(Solution.java:49)
at com.javarush.task.task07.task0716.Solution.main(Solution.java:24)
Никита
8 уровень
Который час не могу понять , что не так)
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Александр Журавлёв
5 января 2020, 07:58решение
Вот смотрите всё дело в Вашей доп проверке. Предположим слово "роза"
Проход, проверяем букву "р"
Заходим в цикл проверки. Там проверяем равна ли "р" с "л" - false.
Т.к. false переход в else strings.remove(i); // удаление элемента ,если не нашли "л"
Всё верно "л" же мы не нашли и удаляем "роза"
Переходим в цикле к следущей итерации - сравниваем равна ли "о" с "л" - ну конечно же нет - false
переход в else strings.remove(i);
"Л" не нашли удаляем из strings ещё одно слово "лоза" ну и так далее
+2
Ksenia Volkova Java Developer в DXC Master
4 января 2020, 16:47
А что происходит с остальными элементами списка, когда ты удаляешь строку? или когда вставляешь?
0
Никита
4 января 2020, 16:52
Как я понимаю , если применять remove то в Arraylist происходит сдвиг
0
Ksenia Volkova Java Developer в DXC Master
4 января 2020, 17:10
Да. А если делать вставку, то тоже происходит сдвиг, но в другую сторону.
И тебе надо это учесть, иначе цикл не будет работать правильно.
0
Олег
4 января 2020, 16:42
if(!string.contains("р") && string.contains("л"))
можно попробывать contains и сделать код гораздо лаконичнее и легче
0