**现在开始运作。我忘了填充数组列表。多么尴尬。

我收到此错误:

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;
}


我已经花了一段时间了,似乎无法找出问题所在。任何帮助,将不胜感激。

最佳答案

给方法赋予与变量相同的名称并没有帮助,但是基本上您的topTen方法没有调用aveRatings()-它只是创建一个空列表:

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


然后尝试在该列表中设置值:

aveList.set(maxBook, 0.0);


即使maxBook完全为空,aveList也将为0。

你的意思是写:

List<Double> aveList = aveRatings();


?请注意,我没有查看其余代码的详细信息-我只是在寻找您为什么立即遇到异常的原因。

09-10 09:18