从 List 中删除元素未按预期工作

2023-12-15

我有一个字符串数组的 ArrayList,它的添加方式如下:

List<String[]> data = new ArrayList<>();
data.add(new String[] {var, lex, valor});

当尝试擦除字符串数组之一时,输出为false因为某些原因。以下是我删除它的方法:

data.remove(new String[] {var, lex, valor});

我也尝试过使用position去除,方法如下:

public void eliminarPos(String var, String lex, String valor, Integer ii) {
    boolean uno = data.remove(ii);
    System.out.println(uno);
}

上述方法的输出是false。有什么办法可以成功地从ArrayList中删除String数组吗?


如果你看一下Javadocs,你会看到有两种不同的重载方法remove。一个采用对象,另一个采用原始整数作为位置:

remove

public E remove(int index)

删除此列表中指定位置的元素。将所有后续元素向左移动(从索引中减去 1)。

上面采用一个原始整数,下面采用一个对象:

remove

public boolean remove(Object o)

从此列表中删除第一次出现的指定元素(如果存在)。如果列表不包含该元素,则它不会改变......

你看到的原因false是因为你提供了原始的包装类int. Integer is an Object,因此 Java 使用与您调用它的方式最相似的方法,在这种情况下,您使用 Object 参数进行调用。 Java然后使用方法签名remove(Object o),并且由于指定IntegerArrayList中不存在,则返回false.

现在,后者失败的原因是您创建了一个新的 String 数组,从而创建了一个新实例。自从new String[] { var, lex, valor } and new String[] { var, lex, valor }不是参考地equal,Java不会在ArrayList中找到相同的Object,并且不会删除该项目。解决方案是使用原始int:

public void eliminarPos(String var, String lex, String valor, int ii) {
    String[] uno = data.remove(ii); //Make sure to use String[], as different types are returned
    System.out.println(uno);
}

然后,Java 将使用接受原始整数的方法,因为您传递了原始整数。你看到的原因incompatible types: String[] cannot be converted to boolean是因为remove(int index)回报指定位置处的实际对象,或删除的对象,而不是boolean like remove(Object o) does.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 List 中删除元素未按预期工作 的相关文章

随机推荐