Arraylist: Индекс вне связанного исключения - PullRequest
0 голосов
/ 26 января 2019

У меня есть два массива - retrievedList с 15 элементами и originalList с 3 элементами. то есть одно является подмножеством другого. Я сравниваю эти два массива, чтобы проверить, отображаются ли 3 элемента оригинального списка в том же порядке в retreiveList.

По сути, метод циклически перебирает каждый индекс в retrievedList и сравнивает его с originalList, когда найдено совпадение, счетчик увеличивается. Если размер счетчика совпадает с размером originalList, тест пройден, иначе произойдет сбой.

Теперь я получаю ошибку java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

Я не уверен, почему метод получает индекс (3) и как это остановить!

Я сделал sysOut счетчика, который выдает результат 0 0 0 0 0 0 0 1 2 3 Это говорит мне о том, что (i) счетчик был увеличен до 3. (ii) он зациклен в 10 раз, в то время как он должен был зацикливаться в 15 раз.

Я попытался завершить цикл for после оператора if-else ... он не работает .. зацикливался только один раз.

Я пытался поставить разрыв в операторе if, пытаясь помешать ему перейти в index (3), не сработало.

вместо i = 0, я попробовал int = -1. Динт работа.

Не могу понять проблему, пожалуйста, помогите.

try{
    int counter = 0;
    for(int i=0; i<retrievedList.size(); i++, ++counter){
        if(retrievedList.get(i).equals(originalList.get(counter))){
            System.out.println(counter);
        }
    } //for loop closed
    if(counter==originalList.size()){
         Assert.assertTrue(true, "Arrays are in Order" - Test Passed!)
    }else{  
         Assert.assertTrue(false, "Arrays are not in Order" - Test failed!)
    }
} catch (Exception e){
    logger.error("test for components has failed");
    e.printStackTrace();
}

У меня нет цикла "=" для

Ответы [ 4 ]

0 голосов
/ 26 января 2019

добавить эту строку в цикл for.

for(int i=0; i<retrievedList.size(); i++){
    if(retrievedList.get(i)==(originalList.get(counter))){
        counter++;
        if(counter == originalList.size())
            break;
        System.out.println(counter);
    }
}
0 голосов
/ 26 января 2019

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

for(int i=0; i<retrievedList.size(); i++){
    if(retrievedList.get(i).equals(originalList.get(counter)) && counter < 3){
    counter++;
    System.out.println(counter);
  } 

Но идея в том, что вам нужно тестировать разные сценарии. Когда целевой список содержит, например, 1,2,3, а вход содержит 1, 2, 4, 1, 2, 3 и так далее. Для этого вам нужно добавить чеки.
Кстати, вы можете использовать: int index=Collections.indexOfSubList(list , sublist); из Collections.indexOfSubList и проверить реализацию там.

0 голосов
/ 26 января 2019

В цикле for вы перебираете retrievedList, и если 3 элемента из originalList найдены, а для counter установлено значение 3, вы продолжите итерации.Таким образом, следующее сравнение будет против originalList.get(3), который выдает ошибку.Добавьте оператор break в цикл for, чтобы завершить егокогда все предметы найдены, что означает counter = 3:

    for(int i=0; i<retrievedList.size(); i++){
        if(retrievedList.get(i).equals(originalList.get(counter))){
            counter++;
            System.out.println(counter);
        }
        if(counter==originalList.size())
            break;   
    }
0 голосов
/ 26 января 2019

После счетчика == 2 оператор в конце цикла, т.е. counter ++, сделает counter = 3, а затем при этом

for(int i=0; i<retrievedList.size(); i++){
    if(retrievedList.get(i).equals(originalList.get(counter))){
    counter++;
    System.out.println(counter);
  }

снова выполнит, что счетчик времени будет равен 3, поэтому originalList.get (counter) выдаст исключение arrayIndexOutOfBound, так как originalList имеет размер только 3, но вы запрашиваете 4-й элемент индекса.

...