2012-04-29 15 views
2

私は、一連の数値をとり、これらの数値の最小値のペアを追加するプログラムを作成しています。失敗したコードは次のとおりです。java throwing exception java.lang.IndexOutOfBoundsException:

import java.util.*; 

public class Library { 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     String answer; 
     int count; 
     int books; 
     int writers; 
     List<Integer> booksList = new LinkedList<>(); 
     System.out.printf("Numbers: "); 

     answer = input.nextLine(); 
     String[] arr = answer.split(" "); 

     for (String num : arr) { 
      booksList.add(Integer.parseInt(num)); 
     } 

     books = booksList.remove(0); 
     writers = booksList.remove(0); 

     while (booksList.size() > writers) { 
      mergeMinimalPair(booksList); 
     } 
    } 

    public static void mergeMinimalPair(List<Integer> books) { 
     int index = 0; 
     int minValue = books.get(0) + books.get(1); 

     for (int i = 1; i <= books.size() - 1; i++){ 
      if ((books.get(i) + books.get(i + 1)) < minValue){ 
       index = i; 
       minValue = books.get(i) + books.get(i + 1); 
      } 
     } 
     //combine(books, index, index + 1); 
    } 

combineメソッドはまだ実装されていません。私は、デバッガでチェックし、それがmergeMinimalPairメソッドを実行しようとするとき、それは次の例外スロー:どのように私はこの例外を避けるん

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 7 
    at java.util.LinkedList.checkElementIndex(LinkedList.java:553) 
    at java.util.LinkedList.get(LinkedList.java:474) 
    at Library.mergeMinimalPair(Library.java:40) 
    at Library.main(Library.java:29) 
Java Result: 1 

を?

答えて

2

ある問題はここにある:

for (int i = 1; i <= books.size() - 1; i++){ 
    if ((books.get(i) + books.get(i + 1)) < minValue){ 
     index = i; 
     minValue = books.get(i) + books.get(i + 1); 
    } 
} 

あなたがbooks.size() - 1まで反復されています。 ibooks.size() - 1と正確に等しい場合、を実行したときに範囲外と見なされるbooks.size()には、i + 1が等しくなります。修正:

for (int i = 1; i < books.size() - 1; i++){ 
    if ((books.get(i) + books.get(i + 1)) < minValue){ 
     index = i; 
     minValue = books.get(i) + books.get(i + 1); 
    } 
} 
2

コード

for (int i = 1; i <= books.size() - 1; i++){ 
    if ((books.get(i) + books.get(i + 1) 

では、私の最大値はbook.size() - 1ですが、books.get(i + 1)ため、この指標は大きすぎます。

最も簡単な変更が

for (int i = 1; i < books.size() - 1; i++){ 
2

あなたのループではなくbooks.size() - 20から行こうと、1からbooks.size() - 1に行きます。配列とコレクションのインデックスは、Javaでは常に0(インクルード)からsize(除外)になります。

関連する問題