有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么是我的ArrayList。删除(id)呼叫不工作?

我有一个ArrayList,其中包含许多我想删除的项。我将要删除的项目的ID存储在另一个列表中。我认为以下代码应该可以正常工作,但由于某些原因,remove()调用返回的值为false:

  ArrayList<Integer> toRemove = new ArrayList<Integer>();
  ArrayList<JCheckBox> al = new ArrayList<JCheckBox>();

  /* Code that adds a bunch of items to al, and a few integers to toRemove */

  System.out.println("Size before removing: " + al.size());
  for (int i = toRemove.size() - 1; i >= 0; i--) {
    System.out.println("Removing id: " + toRemove.get(i) + ": ");
    System.out.println(al.get(toRemove.get(i)));
    System.out.println(al.remove(toRemove.get(i)));
  }
  System.out.println("Size after removing: " + al.size());

如果get()调用也返回了一个假值,我会得到它,但它确实返回了有问题的对象。我错过了什么

上述代码的输出:

Size before removing: 3
Removing id: 2: 
javax.swing.JCheckBox[...]
false
Size after removing: 3

共 (3) 个答案

  1. # 1 楼答案

    您的代码有两个问题。 首先,调用了错误的“toRemove”方法。当调用“toRemove.get(i)”时,返回值将自动装箱到java中。整数,而不是整数。因此,java。util。调用List#remove(Object)而不是java。util。列表#删除(int)。它试图删除整数对象,并返回false。 如果将整数强制转换为int,则将调用所需的方法

    第二个问题:每次删除列表中的一个元素时,所有后续元素的索引都会发生变化,因为这些元素被“下移”。有几种方法可以解决这个问题。一种是按降序排列索引列表。另一种方法是使用一组索引,创建一个新数组,并仅将索引不在该集合中的元素复制到新数组中

  2. # 3 楼答案

    我猜你有一个问题,就是remove()同时被intObject重载,而get()只接受int。试试remove(toRemove.get(i).intValue())

    AbstractCollection中的remove(Object)将搜索列表并删除给定的对象,该对象不在那里,因为您正在向它发送一个Integer,而列表中只有JCheckBox。您正试图调用remove(int),但由于您正在给它一个Integer,因此将调用对象重载。通过将Integer转换为int,可以避免此问题

    另外,您能否始终确保toRemove中的Id始终等于索引?如果toRemove不是按从大到小的顺序排列的,那么它就不会