Следующий код является кодом java Arraylist, и я не могу понять, что с ним не так

#java

Вопрос:

Мой код :-

 public static void main(String[] args) {   //Scanner object.  Scanner scanner = new Scanner(System.in);   //Creating ArrayList.  ArrayListlt;Integergt; list = new ArrayListlt;gt;();   //Creating index varibale to use as counter and keep track of inputs.  int index = list.size() - 1;   //Creating a loop to add user inputs in the list.  while(true) {   //Ask for user input.  int user_input = Integer.valueOf(scanner.nextLine());   if(user_input == -1) {  break;   } else {   list.add(user_input);  index  ;   }  }   while(true) {  //Asking the user for what number to search for in the elemnets.  //Search for it in list and show its index as output.  System.out.print("Search for ");  int ask_user = Integer.valueOf(scanner.nextLine());   if(list.get(index) != ask_user) {   index  ;  continue;   } else {   System.out.println(ask_user   " is at index "   index);  break;  }   }  }  

Теперь всякий раз, когда ввод пользователя выглядит так :-

 4  5  6  7  9  10  -1  Search for 10  Output :- 10 is at index 6  

Ввод образца 2 :-

 3  4  5  6  7  Search for 7  Output :- 7 is at index 4  

This is running fine, but the problem arises when I type inputs like this.

Sample input 3 :-

 33  22  55  -1  Search for 22  Search for 33   Output :- Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3   at java.util.ArrayList.get(ArrayList.java:435)   at IndexOf.main(IndexOf.java:40)  

или

Ввод образца 4 :-

 33  18  -127  90  -345  9  7  37  -1  Search for 9  Search for 9   Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 8, Size: 8   at java.util.ArrayList.rangeCheck(ArrayList.java:659)   at java.util.ArrayList.get(ArrayList.java:435)   at IndexOf.main(IndexOf.java:40)  

Что происходит?

Я не знаю, что я делаю не так, может быть, это как-то связано с хранением, может быть, int недостаточно или что-то в этом роде.

Помогите, пожалуйста.

Комментарии:

1. В первом из случаев вам повезло, что вы искали последнее введенное значение. Поскольку index он все еще указывал на это значение, это сработало. Что вам действительно нужно сделать, так это вернуть индекс в 0

2. чтобы сбросить, добавьте index = 0; в свой код перед вторым циклом

Ответ №1:

Ваш индекс не сбрасывается между двумя циклами, поэтому второй цикл проверит последний элемент, затем элемент с одним более высоким индексом, чем последний, который не существует, и создаст исключение.

Вы также запрашиваете ввод на каждой итерации второго цикла, предположительно, желаемое поведение заключается в поиске по всему списку для каждого ввода. Я рекомендую изучить все циклы для этого, чтобы полностью избежать проблемы с индексом.

Ответ №2:

«int index = list.size() — 1» эффективно сделает индекс равным -1 в начале и, следовательно, всегда будет на 1 меньше, чем должно быть, также я думаю, что вместо использования индекса переменной просто используйте size()-1 в своей программе

Комментарии:

1. Как только элемент добавляется index , значение увеличивается, поэтому добавляется первый элемент, и индекс становится 0 — это правильно.

2. Я не думаю, что «int index = list.size() — 1» даст мне -1 в качестве первого результата, который вряд ли произойдет. Как мы знаем, этот индекс начинается с 0 до n, однако .size() начинается с 1 до n. Итак, допустим, я ввожу «4» в качестве первого ввода в список, затем .size() = 1, затем введя это в уравнение «int index = 1 — 1;» = «int index = 0;» на первом входе.

3. @ScaryWombat , я думаю, вы правы, что мне повезло с первыми двумя входами, но я признаю, что я довольно любитель, поэтому я не понял, как сбросить свой индекс обратно на 0. Можете ли вы предоставить мне код для этого, будет полезно, заранее спасибо.

4. чтобы сбросить, добавьте index = 0; в свой код перед вторым циклом

5. Спасибо вам за помощь всем, я наконец-то заработал, и сейчас я готовлюсь к каждому циклу.