0

Я пытаюсь прочитать список данных целых чисел, найти самые популярные, наименее популярным, и в среднем, и сообщить следующее ...Java: указатель за пределы при использовании ArrayList?

MOST POPULAR NUMBERS 
The following numbers were picked 263 times: 41 

LEAST POPULAR NUMBERS 
The following numbers were picked 198 times: 20 

AVERAGE 
The Average was 228.545455 times. 
The following numbers were picked 228 times: 5 22 
The following numbers were picked 229 times: 2 7 12 40 

Мой код ...

import java.util.*; 
import java.io.*; 
import java.util.Arrays; 
import java.util.Collections; 
public class Hmwk { 

    public static void main(String[] args) throws FileNotFoundException { 
     Scanner input=new Scanner (new File ("input.txt")); 
     int counter = 0; 
     ArrayList<Integer> numberList = new ArrayList<Integer>(45); 
     while(input.hasNextInt()){ 
      int in = input.nextInt(); 
      numberList.add(in); 
      counter++; 
     } 
     mostPopular(numberList,counter); 
     leastPopular(numberList,counter); 
     average(numberList,counter); 


    } 
public static void mostPopular(ArrayList<Integer> list, int total){ 
    Collections.sort(list); 
    int popular = 0; 
    int counter = 0; 
    int counterTwo = 0; 
    for (int i=0; i<total-1; i++){ 
     while(list.get(i) == list.get(i+1)){ 
      counter++; 
      i++; 
     } 
     if(counter > counterTwo){ 
      counterTwo = counter; 
      popular = i; 
     } 
    } 
    System.out.printf("MOST POPULAR NUMBERS"); 
    System.out.printf("The following number was picked",counterTwo,"times:", popular); 

} 
public static void leastPopular(ArrayList<Integer> list, int total){ 
    Collections.sort(list); 
    int unpopular=0; 
    int counter = 0; 
    int counterTwo = 0; 
    for (int i=0; i<total-1; i++){ 
     while(list.get(i) == list.get(i+1)){ 
      counter++; 
      i++; 

     if(counter < counterTwo){ 
      counterTwo = counter; 
      unpopular = i; 
     } 
     } 

    } 
    System.out.printf("LEAST POPULAR NUMBERS"); 
    System.out.printf("The following number was picked",counterTwo,"times:", unpopular); 
} 

public static void average(ArrayList<Integer> list, int total){ 
    int sum = 0; 
    int counter = 0; 
    ArrayList<Integer> average = new ArrayList<Integer>(45); 
    for (int i=0; i<total-1; i++){ 
     while(list.get(i) == list.get(i+1)){ 
      counter++; 
      i++; 
     } 
     average.add(counter); 
    } 


    for (int i = 0; i <average.size(); i++){ 
     sum+= average.get(i); 
    } 
    double average2 = sum/total; 
    System.out.printf("AVERAGE"); 
    System.out.printf("The Average was",average,"times."); 
    double ceiling = Math.ceil(average2) ; 
    double floor = Math.floor(average2); 
    int counter2 = 0; 
    Collections.sort(list); 
    for (int i=0; i<total-1; i++){ 
     while(list.get(i) == list.get(i+1)){ 
      counter2++; 
      i++; 
     } 
     if(counter2 == ceiling){ 
      System.out.printf("The following number was picked", ceiling,"times:",i); 
     } 
     if (counter2 == floor){ 
      System.out.printf("The following number was picked", floor,"times:",i); 
    } 


    } 

} 

Я получаю ошибку ...

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2555, Size: 2555 
    at java.util.ArrayList.RangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at Hmwk.mostPopular(Hmwk.java:31) 
    at Hmwk.main(Hmwk.java:19) 

И я не могу понять, почему. Я не думал, что мне нужно беспокоиться о outofboundsexceptions при использовании ArrayList? О, и это мой первый раз, используя ArrayList, поэтому, если мой код крайне уродлив, я прошу прощения. Любая помощь очень ценится!

ответ

0

В каждой функции, у вас есть:

for (int i=0; i<total; i++){ 
while(list.get(i) == list.get(i+1)){ 
     counter++; 
     i++; 
    } 

и в while заявления вы увеличиваете I по i++, поэтому, когда list.get(i) == list.get(i+1), это вызовет exception.You должны проверить i значения внутри while высказывания:

while(list.get(i) == list.get(i+1)){ 
     counter++; 
     i++; 
     if(i == total-1) break; 
    } 

И если i = max (i = total), то i+1 (i = total + 1) вызовет исключение.

+0

Я изменил все функции с помощью total-1, чтобы исправить это, но я все равно получаю ту же ошибку? – user102817

+0

@ user102817 Обновите свой последний код. –

+0

Теперь обновлено – user102817

1

На последней итерации вы пытаетесь использовать get по индексу из массива.

int counterTwo = 0; 
for (int i=0; i<total; i++){ 
    while(list.get(i) == list.get(i+1)){ 

Допустим total = 10, что означает, что массив из 0-9, чем когда мы в последний итерации вы используете в i = 9 действие .get(i+1) в результате с .get(10) == Exception!

Исправление: Правильное исправление остановит массив до индекса.
Изменение:

for (int i=0; i<total; i++){ 

С этим:

for (int i=0; i<total-1; i++){ 
+0

Я даже не думал об этом, но я сделал это ко всем своим циклам, и я все равно получаю ту же ошибку – user102817

0

Ваша потребность изменить ваш цикл для

for (int i=0; i<total-1; i++){ 

иначе пытается получить доступ к [я + 1] будет, за исключением ,

Я не думаю, что мне нужно было беспокоиться о outofboundsexceptions при использовании ArrayList

да, вы делаете, когда доступ к конкретному индексу. Только когда вы добавляете материал в ArrayList, вам не нужно беспокоиться о размере, в отличие от обычного массива.

Смежные вопросы