2

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

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

この例外を回避するにはどうすればよいですか?

4

3 に答える 3

2

コード内

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

iの最大値はですbook.size() - 1が、books.get(i + 1)このインデックスは大きすぎます。

最も簡単な変更は

for (int i = 1; i < books.size() - 1; i++){
于 2012-04-29T13:56:49.913 に答える
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() - 1iが正確にに等しい場合books.size() - 1i + 1はに等しいbooks.size()。これは、を実行すると範囲外と見なされますbooks.get(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);
    }
}
于 2012-04-29T13:57:11.510 に答える
2

ループはから1books.size() - 1はなく、から0になりbooks.size() - 2ます。Javaでは、配列とコレクションのインデックスは常に0(含まれる)からサイズ(除外される)になります。

于 2012-04-29T13:57:16.723 に答える