java.lang.IndexOutOfBoundsException:索引 7,大小:7
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20379351/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.lang.IndexOutOfBoundsException: Index 7, Size:7
提问by
I am creating a program that finds the solutions to the eight queens problem by breadth search. My code so far:
我正在创建一个程序,通过广度搜索找到八皇后问题的解决方案。到目前为止我的代码:
import java.util.*;
import java.lang.*;
import java.io.*;
public class EightQueens {
public static void main(String[ ] args) {
ArrayList<List<Integer>> states = new ArrayList<List<Integer>>();
List<Integer> start=new ArrayList<Integer>();
for (int s=0; s<8; s++) {
start.add(0);
}
states.add(start);
List<Integer> a = new ArrayList<Integer>();
List<Integer> b = new ArrayList<Integer>();
for (int j=1; j<9; j++) {
a = states.get(0);
states.remove(0);
if (j==1) {
for (int n=1; n<9; n++) {
a.set(0,n);
states.add(a);
}
}
else {
for (int i=j-1; i>0; i--) {
b.add(a.get(i-1));
b.add(a.get(i-1)-1);
b.add(a.get(i-1)+1);
}
for (int n=0; n<8; n++) {
List<Integer> c = new ArrayList<Integer>();
for (int t=1; t<9; t++) {
c.add(t);
}
for (int k=0; k<b.size(); k++) {
if (c.get(n)== b.get(k)) {
c.remove(n);
}
}
for (int r=0; r<c.size(); r++) {
if (c.get(r)==n+1) {
a.set(j-1,n+1);
states.add(a);
}
}
}
}
}
for (int m=0; m< states.size(); m++) {
a = states.get(0);
for (int p=0; p< a.size(); p++) {
int q = a.get(p);
System.out.print(q);
}
states.remove(a);
System.out.println(" ");
}
int numsol = states.size();
System.out.println(numsol);
}
}
This compiles without any errors, but when I go to run the program I get this error:
这编译没有任何错误,但是当我去运行程序时,我收到此错误:
Exception in thread "main" java.lang.IndexOutofBoundsException: Index: 7, Size: 7
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(Arraylist.java:411)
at EightQueens.main(EightQueens.java:48)
How can I fix this?
我怎样才能解决这个问题?
回答by Dodd10x
Java uses 0 for the first index, not one. Adjust your program accordingly and it will work. If you have 7 items in an array you use 0-6, not 1-7.
Java 使用 0 作为第一个索引,而不是一个。相应地调整您的程序,它将起作用。如果数组中有 7 个项目,则使用 0-6,而不是 1-7。
Also, use descriptive names for your variables. a, b, m, x, etc are just bad.
此外,为您的变量使用描述性名称。a、b、m、x 等都不好。
回答by Blub
The problem is the following:
问题如下:
if (c.get(n)== b.get(k)) {
c.remove(n);
}
You are iterating over your b
list and probably remove an element from c
when n
is 7, so you end up with only 7 elements in c
and therefore an OutOfBoundsException.
您正在迭代您的b
列表,并且可能从c
when n
is 7 中删除一个元素,因此您最终只有 7 个元素c
,因此出现了 OutOfBoundsException。
What you wanna do is to add a break
that the iteration stops once so you have deleted the element:
你想要做的是添加一个break
迭代停止一次这样你就删除了元素:
if (c.get(n)== b.get(k)) {
c.remove(n);
break;
}
This should fix it.
这应该解决它。