В то время как цикл, IndexOutOfBoundsException: Индекс: 1, Размер: 1 - PullRequest
0 голосов
/ 26 августа 2018

Полный код:

  public static String[] dirReduc(String[] arr) {


    LinkedList<String> list = new LinkedList<>(Arrays.asList(arr));


    for (int t = 0; t < list.size(); t++) {
        for (int q = t + 1; q < list.size() ; q++) {


        while (list.get(t).contains("NORTH") && list.get(q).contains("SOUTH") ||
                list.get(t).contains("SOUTH") && list.get(q).contains("NORTH") ||
                list.get(t).contains("WEST") && list.get(q).contains("EAST") ||
                list.get(t).contains("EAST") && list.get(q).contains("WEST"))



            for (int i = 0; i < list.size(); i++) {
                for (int k = i + 1; k < list.size(); k++) {

                    if (list.get(i).contains("NORTH") && list.get(k).contains("SOUTH") ||
                        list.get(i).contains("SOUTH") && list.get(k).contains("NORTH") ||
                        list.get(i).contains("WEST") && list.get(k).contains("EAST") ||
                        list.get(i).contains("EAST") && list.get(k).contains("WEST")) {
                        list.remove(i);
                        list.remove(k - 1);
                    }
                }
                }
            }
        System.out.println(list);
    }
    return null;
}

Петли для удаления работают нормально.

Мой вопрос о цикле while:

в цикле while в этом поле:

 list.get(t).contains("WEST") && list.get(q).contains("EAST") ||

У меня есть: IndexOutOfBoundsException: Index: 1, Size: 1

В списке остается только один элемент.

Насколько я мог получить: index q проверить элемент после последнего элемента в списке и получить OutOfBound.

Как это исправить?

В аналогичных темах я не могНе нашли четкого ответа, на мой вопрос, пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 26 августа 2018

Следует проверять не перед циклом, а сам цикл.

После проверки условий цикла для цикла разрыва.

работают так:

    LinkedList<String> list = new LinkedList<>(Arrays.asList(arr));


    for (int t = 0; t < list.size(); t++) {
        for (int q = t + 1; q < list.size(); q++) {
                while (list.get(t).contains("NORTH") && list.get(q).contains("SOUTH")
                       || list.get(t).contains("SOUTH") && list.get(q).contains("NORTH")
                       || list.get(t).contains("WEST") && list.get(q).contains("EAST")
                       || list.get(t).contains("EAST") && list.get(q).contains("WEST"))

                    if (q < list.size()) q = t;


                for (int i = 0; i < list.size(); i++) {
                    for (int k = i + 1; k < list.size(); k++) {

                        if (list.get(i).contains("NORTH") && list.get(k).contains("SOUTH")
                                || list.get(i).contains("SOUTH") && list.get(k).contains("NORTH")
                                || list.get(i).contains("WEST") && list.get(k).contains("EAST")
                                || list.get(i).contains("EAST") && list.get(k).contains("WEST")) {
                            list.remove(i);
                            list.remove(k - 1);
                        }
                    }
                }
            }
        System.out.println(list);
        }
    return null;
}

Спасибо всемкто отвечает.

0 голосов
/ 26 августа 2018

У вас есть q равное (t + 1), которое уже выходит за границы, поэтому вы должны проверить, меньше ли q или равно размеру списка, чтобы запустить цикл while для продолжения программы.

if (q <= list.size()) {
    // Your while loop
}
0 голосов
/ 26 августа 2018

Это должно решить проблему.

Вам необходимо проверить индекс, прежде чем использовать его в списке:

while (t < list.size() && q < list.size() &&  (list.get(t).contains("NORTH") && list.get(q).contains("SOUTH") ||
                list.get(t).contains("SOUTH") && list.get(q).contains("NORTH") ||
                list.get(t).contains("WEST") && list.get(q).contains("EAST") ||
                list.get(t).contains("EAST") && list.get(q).contains("WEST")))
0 голосов
/ 26 августа 2018

Почему бы не проверить, есть ли в списке один или нет, прежде чем вводить цикл while, как это, потому что именно в этом случае возникает ошибка.

  if(list.size() == 1)
     q=t

в вашем коде, подобном этому:

for (int t = 0; t < list.size(); t++) {
        for (int q = t + 1; q < list.size() ; q++) {
          if(list.size() == 1)
             q=t;
        while (list.get(t).contains("NORTH") && list.get(q).contains("SOUTH") ||
                list.get(t).contains("SOUTH") && list.get(q).contains("NORTH") ||
                list.get(t).contains("WEST") && list.get(q).contains("EAST") ||
                list.get(t).contains("EAST") && list.get(q).contains("WEST"))

или избегайте цикла while, если список содержит ровно один элемент.

...