Java 由于函数调用,ArrayList无法添加元素

Java 由于函数调用,ArrayList无法添加元素,java,arraylist,Java,Arraylist,运行下面的代码段时,循环会正确执行,但由于某些原因,没有添加元素 for(i=5;i<=500;i++) { x.add(i); check(x,i); } public static void check(ArrayList<Integer> x,Integer i){ for(int j=0;j<x.size();j++){ for(int k=0;k<x.

运行下面的代码段时,循环会正确执行,但由于某些原因,没有添加元素

for(i=5;i<=500;i++) {
    x.add(i);
    check(x,i);
}

public static void check(ArrayList<Integer> x,Integer i){
    for(int j=0;j<x.size();j++){                                
        for(int k=0;k<x.size();k++){
            if(x.get(j)!=i&& x.get(k)!=i){
                if(x.contains(x.get(k)+x.get(j)))
                    x.remove(Integer.valueOf(i));
            }
        }
    }
}

用于(i=5;i您正在从列表中删除int i,而不是计算值。如果使用contains方法,您应该删除该部分。每次运行该方法时,它都会删除参数中为i插入的任何内容。因此,每次添加内容时,您都只需使用该方法并删除刚才添加的内容。

赋值相当简单很有趣,但您尝试的方法确实太昂贵(而且非常错误,因为您在迭代过程中修改了列表)

因此,这里有一点改进:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    IntStream.range(5, 500)  
        .filter(i -> !check(list,i))    // check first
        .forEach( i -> list.add(i));    // add after
    System.out.println(list);
}
// we assume (rightly so) that list is ordered
private static boolean check(List<Integer> list, int value) {
    boolean found = false;
    for(int j=0; j < list.size(); j++){
        Integer leftSide = list.get(j);
        if(leftSide > value/2){   
            break;                  // as the check is symmetrical, stop after value/2 has been overtaken
        }
        Integer complementaryValue = value - leftSide;
        for(int k=j+1; k < list.size(); k++){  // iterate over the rest of the list (because right is necessarily > left)
            Integer rightSide = list.get(k);
            if(rightSide > complementaryValue){  
                break;              // no need to continue further
            }
            if(complementaryValue.equals(rightSide)){
                found = true;
                System.out.println(value+" = "+leftSide+" + "+rightSide);
                break;
            }
        }
        if(found){
            break;  // or return true
        }
    }
    return found;
}
publicstaticvoidmain(字符串[]args){
列表=新的ArrayList();
IntStream.range(5500)
.filter(i->!check(list,i))//先检查
.forEach(i->list.add(i));//在后面添加
系统输出打印项次(列表);
}
//我们(正确地)假定列表是有序的
私有静态布尔检查(列表,int值){
布尔值=false;
对于(int j=0;j值/2){
break;//由于检查是对称的,所以在超过值/2后停止
}
整数互补值=值-左侧;
对于(int k=j+1;k左边)
整数rightSide=list.get(k);
如果(右侧>互补值){
break;//无需继续
}
if(互补值等于(右侧)){
发现=真;
System.out.println(值+“=”+左侧+“+”+右侧);
打破
}
}
如果(找到){
break;//或返回true
}
}
发现退货;
}
你可以试试

这还远远不是最优的,仍然可以在内部循环上进行工作。对互补值进行二分法搜索会更好

最后的名单是

[5, 6, 7, 8, 9, 10, 20, 21, 22, 23, 24, 35, 36, 37, 38, 39, 50, 51, 52, 53, 54, 65, 66, 67, 68, 69, 80, 81, 82, 83, 84, 95, 96, 97, 98, 99, 110, 111, 112, 113, 114, 125, 126, 127, 128, 129, 140, 141, 142, 143, 144, 155, 156, 157, 158, 159, 170, 171, 172, 173, 174, 185, 186, 187, 188, 189, 200, 201, 202, 203, 204, 215, 216, 217, 218, 219, 230, 231, 232, 233, 234, 245, 246, 247, 248, 249, 260, 261, 262, 263, 264, 275, 276, 277, 278, 279, 290, 291, 292, 293, 294, 305, 306, 307, 308, 309, 320, 321, 322, 323, 324, 335, 336, 337, 338, 339, 350, 351, 352, 353, 354, 365, 366, 367, 368, 369, 380, 381, 382, 383, 384, 395, 396, 397, 398, 399, 410, 411, 412, 413, 414, 425, 426, 427, 428, 429, 440, 441,442,443,444,455,456,457,458,459,470,471,472,473,474,485,486,487,488,489]


这应该删除重复的值吗?不,不……它应该删除存在一对和该元素相等的元素。你能包含代码的其余部分吗,因为很难判断这样做有什么错。好吧,当你在一个列表上迭代你要删除的项时,你不应该期望有任何错误ng而不是
BoundsException的ArrayOutOfBoundsException
。事实上,你很幸运它什么也没做。似乎你正在删除你添加的任何数字。没问题,请打勾让我知道它已完成并回答:)否则人们将继续发布。