删除等于n的ArrayList元素

时间:2014-08-21 21:14:05

标签: java arraylist

for (int cell: locations){ // locations is a ArrayList of integers
        if (guess == cell) {
            result = "hit";
            //locations.set(cell, null);
            numOfHits++;
            break;
        }
    }

我的问题是用计算机玩扫雷并且在循环中我正在检查每个目标位置,所以在我检查其中一个之后我想再不再检查一次!! 我试图删除但是ArrayList elemet等于单元格但是当输入再次是相同的索引时它会带来错误。我试图将已选中的一个设置为null,但它也有错误!

2 个答案:

答案 0 :(得分:1)

最好不要尝试手动修改ArrayList的内容 在ArrayList<Integer>上将特定索引设置为null时,您实际上并未删除该元素。您将该元素保留在原位,但值为null

    ArrayList<Integer> locations = new ArrayList<>();
    locations.add(1);
    locations.add(2);
    System.out.println(locations); // [1, 2]
    locations.set(0, null);
    System.out.println(locations); // [null, 2]

当您稍后尝试访问设置为null的索引时,当您尝试将NullPointerException取消装入null时,您可能会获得int }:

    int i = locations.get(0); // throws NPE trying to convert null to int

使用Iterator代替使用for-each循环,它可以在遍历数据结构时安全地修改数据结构的内容:

    Iterator<Integer> itr = locations.iterator();
    while (itr.hasNext()) {
        int cell = itr.next();
        if (guess == cell) {
            result = "hit";
            itr.remove();
            numOfHits++;
            break;
        }
    }

答案 1 :(得分:0)

您可以从ArrayList中删除该元素。但请注意,它会减少以下所有元素的索引(即前一个(第i + 1)个元素将成为新的第i个元素),因此您必须将循环索引递减到帐户为了那个原因。实际上,如果你在删除项目后从循环中断开,那么如果你递减索引并不重要。

    for (int i=0; i<locations.size();i++){
        int cell = locations.get(i);
        if (guess == cell) {
            result = "hit";
            locations.remove(i);
            i--; // this only matters if you continue iterating over the list
            numOfHits++;
            break;
        }
    }