IndexOutOfBoundsException

89
03 февраля 2022, 21:00
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

Не понимаю, в чём ошибка.

Вот задача:

  1. Создай список слов, заполни его самостоятельно.
  2. Метод fix должен:

    2.1. удалять из списка строк все слова, содержащие букву "р"

    2.2. удваивать все слова содержащие букву "л".

    2.3. если слово содержит и букву "р" и букву "л", то оставить это слово без изменений.

    2.4. с другими словами ничего не делать.

Answer 1

Не знаю полного условия, но думаю, что встроенные функции можно использовать, так как используешь ArrayList.

public static ArrayList<String> fixFromMichael(ArrayList<String> strings) {
        for(int i = 0; i < strings.size(); i++) {
            if(strings.get(i).contains("р") && strings.get(i).contains("л")) {
                continue;
            }
            if(strings.get(i).contains("р")) {
                strings.remove(i);
            }
            if(strings.get(i).contains("л")) {
                strings.add(strings.get(i));
                i++;
            }
        }
        return strings;
    }
Answer 2

В массиве три слова. Удаляем одно из них. Остается два. После этого пытаемся удалить слово с индексом 2 и попадаем куда? Прямиком в IndexOutOfBoundsException потому что элемента с индексом 2 уже не существует.

Answer 3

После удаления строки надо уменьшать i на единицу и предельное значение в цикле т.е. изначально count = strings.size() а после удаления count--; i--;, т.к. индексы смещаются после удаления. Соответственно когда идет обращение ко 2 элементу списка его уже не существует.

Можно решить так:

 public static void main( String[] args ){
    ArrayList<String> data = getData();
    fix( data );
    System.out.println( data );
}

private static ArrayList<String> getData(){
    return new ArrayList<>(Arrays.asList( "роза", "лоза", "лира" ));
}

private static void fix( ArrayList<String> data ){
    String str;
    for( int i = data.size()-1; i >= 0; i-- ){
        str = data.get(i);
        if(str.indexOf( 'р' )!=-1 && str.indexOf( 'л' )!=-1){
            continue;
        }
        if(str.indexOf( 'р' )!=-1){
            data.remove( i );
            continue;
        }
        if(str.indexOf( 'л' )!=-1){
            data.set(i,str+str);
        }
    }
}
Answer 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) {
        ArrayList<String> stringsNew = new ArrayList<>();
        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) == 'л') {
                            stringsNew.add(buffer);// если и "р" и "л" - добавим слово в новый лист 
                            // и выйдем из цикла
                            break; 
                        }
                    }
                } else if (chars.get(j) == 'л') { // если равно л , то запускаем доп проверку
                    int k; // доп проверка
                    for (k = j; k < chars.size(); k++) {
                        if (chars.get(k) == 'р') {  
                            stringsNew.add(buffer); // если и "р" и "л" - добавим слово в новый лист
                            // и выйдем из цикла
                            break;
                        }
                        if(k==chars.size()-1){
                            stringsNew.add(buffer);
                            stringsNew.add(buffer); // добавим в новый лист 2 эксемпляра слова
                            // дошли до конца слова и не нашли "р"
                        }
                    }
                }
            }
        }
        return stringsNew; // вернем в новый список 
    }
}
READ ALSO
Как закрепить flex элемент справа сверху?

Как закрепить flex элемент справа сверху?

В флекс каталоге есть меню и товары, как закрепить меню в правом верхнем углу так, чтобы товары обтекали его слева и снизу? https://jsfiddlenet/4roj2ced/

164
Как изменить прозрачность элемента при прокрутке страницы?

Как изменить прозрачность элемента при прокрутке страницы?

Есть текст на странице, у него opacity стоит 0, и как только пользователь его увидит (к примеру прокрутит страницу) то у него должна стать opacity 1 с неким...

100
Двойное нажатие на кнопку

Двойное нажатие на кнопку

Спасибо вашему сайту за помощь

118
animation-iteration-count не работает

animation-iteration-count не работает

Не понимаю почему animation-iteration-count работает только для последней анимации?

102