我正在创建一个程序,它接受一系列数字并添加这些数字的最小对。失败的代码如下:
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
如何避免此异常?
答案 0 :(得分: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++){
答案 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
。当i
完全等于books.size() - 1
时,i + 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);
}
}
被视为超出范围。修正:
{{1}}
答案 2 :(得分:2)
您的循环从1
转到books.size() - 1
,而不是从0
转到books.size() - 2
。在Java中,数组和集合索引总是从0(包含)到大小(不包括)。