我对Java很新,并尝试编写一个算法,该算法返回总数相等的索引之和。
当我点击关于边界的递归函数时,我收到错误。这些界限对我来说似乎很好,我只是传递更新的arraylist所以我不知道它来自哪里。
错误
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at com.example.helloworld.HelloWorld.getMatches(HelloWorld.java:36)
at com.example.helloworld.HelloWorld.getMatches(HelloWorld.java:41)
算法
public class HelloWorld {
ArrayList<Integer> matches = new ArrayList<>();
ArrayList<Integer> temp = new ArrayList<>();
public static void main(String[] args) {
ArrayList<Integer> param = new ArrayList<>(Arrays.asList(0, 0, 0, 0, 1, 1));
int res = new HelloWorld().pairwise(param, 1);
System.out.println(res);
}
private int pairwise(ArrayList<Integer> arr, Integer total) {
for (Integer item: arr) {
this.temp.add(item);
}
getMatches(this.temp, total);
return getIndices(this.matches, arr);
}
private void getMatches(ArrayList<Integer> arr, Integer total) {
boolean noMatch = true;
for (int i=1; i<arr.size(); i++) {
if (arr.get(0) + arr.get(i) == total) {
//add to matches
this.matches.add(arr.get(0));
this.matches.add(arr.get(i));
//remove from temp
this.temp.remove(0);
this.temp.remove(arr.get(i));
noMatch = false;
if (this.temp.size() > 1) {
//ERROR HERE
getMatches(this.temp, total);
}
}
}
if (noMatch) {
this.temp.remove(0); //remove first one
if (this.temp.size() > 1) {
getMatches(this.temp, total);
}
}
}
private int getIndices(ArrayList<Integer> matches, ArrayList<Integer> array) {
int count = 0;
for (Integer item: matches) {
int index = array.indexOf(item);
count += index;
array.set(index, -3000);
}
return count;
}
}
非常感谢任何帮助。
答案 0 :(得分:3)
urm ...你正在从你正在迭代的数组中删除元素...
这里:
for (int i=1; i<arr.size(); i++) {
//...code
}
你循环遍历6的数组的初始大小。然后在for循环体的里面你删除元素你正在循环的数组:
//remove from temp
this.temp.remove(0);
this.temp.remove(arr.get(i));
每次迭代都会缩短数组,这就是为什么你会超出限制异常的原因。
您希望复制传递给getMatches
的数组,即
getMatches(new ArrayList<>(this.temp), total);
这样您就可以从temp
中移除元素,但不会影响您实际迭代的数组:arr
答案 1 :(得分:1)
您必须删除i
处的元素,然后移除0
:
//remove from temp
this.temp.remove(arr.get(i));
this.temp.remove(0);
答案 2 :(得分:0)
在条件
中添加-1private void getMatches(ArrayList<Integer> arr, Integer total) {
boolean noMatch = true;
for (int i=1; i<arr.size()-1; i++) {
if (arr.get(0) + arr.get(i) == total) {
//add to matches
this.matches.add(arr.get(0));
this.matches.add(arr.get(i));
//remove from temp
this.temp.remove(0);
this.temp.remove(arr.get(i));
noMatch = false;
if (this.temp.size() > 1) {
//ERROR HERE
getMatches(this.temp, total);
}
}
}
if (noMatch) {
this.temp.remove(0); //remove first one
if (this.temp.size() > 1) {
getMatches(this.temp, total);
}
}
}