Проблема с ArrayList, Java - PullRequest
       15

Проблема с ArrayList, Java

0 голосов
/ 01 февраля 2012

** Работай сейчас.Я забыл заполнить список массивов.Как неловко.

Я получаю эту ошибку:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.set(ArrayList.java:397)
at Netbooks.Calculations.topTen(Calculations.java:93)
at Netbooks.Test.main(Test.java:33)
Java Result: 1

Ошибка относится к этой конкретной строке: aveList.set (maxBook, 0.0);

Что выглядитпоправьте меня, но опять же я новичок и, вероятно, ошибаюсь ...

Я собираюсь добавить еще немного кода, чтобы вы, ребята, могли проверить размер массива и еще много чего, надеюсь, поймать что-то, что яне.

Вот метод с ошибкой:

    public List<String> topTen() throws IOException {
    Books books = new Books();
    List<String> bookList = books.readBooks();

    List<String> topList = new ArrayList<String>(10);
    List<Double> aveList = new ArrayList<Double>();

    for (int i = 0; i < 10; i++) {
        double maxRating = 0.0;
        int maxBook = 0;

        for (int j = 0; j < aveList.size(); j++) {
            if (maxRating < aveList.get(j)) {
                maxRating =  aveList.get(j);
                maxBook = j;
            }
        }
        topList.add(bookList.get(maxBook));
        aveList.set(maxBook, 0.0);
    }

    return topList;
}

Вот где изначально генерируется ArrayList "aveList":

public List<Double> aveRatings() throws IOException {
    Books books = new Books();
    Ratings ratings = new Ratings();
    PureRatings pureRatings = new PureRatings();

    int numBooks = books.readBooks().size();
    int numCust = ratings.readCustomers().size();
    List<List<Integer>> pureRatingsList = pureRatings.parseRatingsFile();
    List<Double> aveRatings = new ArrayList<Double>();

    for (int j = 0; j < numBooks; j++) {
        double sum = 0;
        double counter = 0;

        for (int i = 0; i < numCust; i++) {
            if (pureRatingsList.get(i).get(j) != 0) {
                sum = sum + pureRatingsList.get(i).get(j);
            } else {
                counter++;//Increase counter.
            }
        }
        if (counter == numCust) {
            aveRatings.add(0.0);
        } else {
            aveRatings.add((sum) / (numCust - counter));
        }
    }
    return aveRatings;
}

IЯ уже давно занимаюсь этим и, похоже, не могу понять, в чем дело.Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Не помогает, что вы даете методам то же имя, что и переменным, но в основном ваш topTen метод не вызывает aveRatings() - он просто создает пустой список:

List<Double> aveList = new ArrayList<Double>();

Затем он пытается установить значения в этом списке:

aveList.set(maxBook, 0.0);

maxBook будет 0, даже если aveList полностью пуст.

Вы хотели написать:

List<Double> aveList = aveRatings();

? Обратите внимание, что я не смотрел подробности остальной части кода - я только искал, почему вы получаете ваше немедленное исключение.

1 голос
/ 01 февраля 2012

Из JavaDoc для List.set()

Заменяет элемент в указанной позиции в этом списке на указанный элемент (необязательная операция).

У вас ничего нет в списке, поэтому нет действительного индекса для замены.

...