0

我试图从 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

4 回答 4

5

使用 for 循环

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.

于 2019-01-04T21:13:13.873 回答
1

您在遍历/迭代循环中的列表时尝试删除项目for。您不能从在 for 循环中迭代它的列表中删除一个项目。改用 anIterator并调用arr.remove().

于 2019-01-04T21:18:02.090 回答
1

如果您使用 Java 8,您可以这样做

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

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

此外,您应该将您的声明更改arr

List<Arr> arr = new ArrayList<>();
于 2019-01-04T21:20:32.070 回答
0

这里有几件事......

  1. 理想情况下,循环变量接收器类型应该是Arr,而不是Object列表包含Arr对象。这也意味着您不再需要正在表演的演员阵容。
  2. 您可以通过删除该项目,remove(Object o)但这需要覆盖equals并且仅hashcode基于name。另一种选择是通过迭代器,但这意味着完全改变你的代码。因此,为了使其尽可能接近您的代码,您可以使用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
     }
}
于 2019-01-04T21:22:31.457 回答