2012-02-01 13 views
0

**今すぐ動作しましたか?私は配列リストに値を設定するのを忘れました。どのように恥ずかしい。ArrayList、Javaに関する問題

私はこのエラーを得ている:

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)。私には正しいように見えますが、その後、再び、私は新たなんだと、おそらく間違っている

...

私は、あなたたちは、配列やその他もろもろの大きさを確認することができるようにいくつかのより多くのコードを追加するつもりですうまくいけば私がしなかったものをキャッチします。 ArrayListの「aveListは」最初に生成されるのはここ

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

は次のとおりです:ここで

はエラーを持っている方法である

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

私は今しばらくの間、それをしてきたし、何が間違っているのか分からないようです。どんな助けもありがとう。

答えて

2

それはあなたがメソッドに変数と同じ名前を与えているが、基本的にはあなたのtopTen方法はaveRatings()を呼び出していないことを助けていない - それだけで空のリストを作成しています:

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

それは、その後にしようとしていますそのリスト内の設定値:

aveList.set(maxBook, 0.0); 

maxBookaveListが完全に空の場合でも0になります。

次のように記述するもしかして:

List<Double> aveList = aveRatings(); 

?残りのコードの詳細は見ていないことに注意してください。私はただちに例外が発生する理由を探しました。リストに何も持っていないので、交換する有効なインデックスがありませんList.set()

Replaces the element at the specified position in this list with the specified element (optional operation).

ためJavaDocから

+0

はい!何が簡単な間違い...私はそれが今働いている。ありがとうございました! – Marcos

+1

私はコードの2番目のブロックが何のためにあったのだろうかと思っていた... – styfle

+0

"これは、あなたが変数と同じ名前をメソッドに与えているのに役立つわけではありません。私は新しいので、言語の慣習に従うのはひどいです... – Marcos

1

+0

はい、私はそれをaveRatings()メソッドの配列リストと同じにしておく必要があるときは、何も配置しませんでした。単に忘れてしまった。ありがとう。 – Marcos

関連する問題