使用for循环从ArrayList中删除特定对象

时间:2019-01-04 21:06:43

标签: java

我试图从ArrayList中删除一个对象,但是在使用for循环遍历列表之后,我陷入了下一步的困境。 nameInput是用户的小写字符串。

如果运行此命令,它将从arr列表中打印对象,该对象等于nameInput的输入。但是我不知道如何从打印该对象到删除它?

我确定这是一个愚蠢的问题,但是我阅读并尝试过的50多个答案似乎都使​​我失望(或更可能是我听不懂)。我已经尝试过list.remove和removeIf。

private ArrayList<Arr> arr = new ArrayList<>();

private void removeItem() {
    for (Object arr : arr) {
        if (((Arr) arr).getName().equals(nameInput())) {
            System.out.println(arr);        
            break;
        } else {
            System.out.println("Error");
        }
    }
}

4 个答案:

答案 0 :(得分:5)

使用循环

List<Arr> arr = new ArrayList<>();

for (Arr item : arr) {
    if (item.getName().equals(nameInput())) {
        arr.remove(item);
        break;
    }
}

如果在删除元素之后未调用break,则会得到ConcurrentElementException

@Aomine 中的注释:您必须实现正确的Arr.equals()方法。


使用迭代器

List<Arr> arr = new ArrayList<>();
Iterator<Arr> it = arr.iterator();

while (it.hasNext()) {
    Arr items = it.next();

    if (item.getName().equals(nameInput())) {
        it.remove();
        break;  // you can continue iterating and remove another item
    }

}

使用流

List<Arr> arr = new ArrayList<>();
arr.removeIf(item -> item.getName().equals(nameInput()));

删除所有符合指定条件的项目


ArrayList中删除元素不是很好。如果您知道必须从List的中间删除元素,请使用LinkedList

答案 1 :(得分:1)

在遍历/迭代for循环中的列表时,您试图删除一个项目。您无法从列表中删除项目,并在for循环中对其进行迭代。改用Iterator并调用arr.remove()

答案 2 :(得分:1)

如果您使用Java 8,则可以

private void removeItem() {
    arr.removeIf(t -> t.getName().equals(nameInput));
}

请注意,这将删除名称等于nameInput的所有对象

您还应该将arr的声明更改为

List<Arr> arr = new ArrayList<>();

答案 3 :(得分:0)

这里有几件事...

  1. 理想情况下,循环变量接收器类型应为Arr而不是Object,因为列表包含Arr对象。这也意味着您不再需要执行的演员表。
  2. 您可以通过remove(Object o)删除项目,但这仅需基于equals覆盖hashcodename。另一个选择是通过迭代器,但这将意味着完全更改代码。因此,为了使其尽可能接近您的代码,您可以使用for循环;获取对象所在的索引,然后删除。

因此,您可以这样做:

for(int i = 0; i < arr.size(); i++){
    if (arr.get(i).getName().equals(nameInput)) {
          Arr obj = arr.remove(i); // remove the item by index     
          System.out.println(obj);  // print the object             
          break;  // terminate the loop iteration
     }
}