繁体   English   中英

从列表中删除元素 <String[]> 不能按预期工作

[英]Removing an element from a List<String[]> not working as expected

我有一个String数组的ArrayList像这样添加:

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

尝试擦除String数组之一时,由于某种原因,输出为false 这是我删除它的方法:

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

我也尝试过使用位置删除,方法如下:

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)

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

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

remove

public boolean remove(Object o)

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

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

现在,后者失败的原因是您创建了一个新的String数组,从而创建了一个新实例。 由于new String[] { var, lex, valor }new String[] { var, lex, valor }引用上不相等,因此Java在ArrayList中找不到相同的对象,因此不会删除该项目。 解决方案是使用原始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) 在指定的位置返回实际的Object ,或者被删除的对象,而不是像remove(Object o)那样的boolean

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

永远不会工作,因为即使数组包含相同的东西,它们也不相等,并且在列表中也找不到数组。


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

将不起作用,因为您将其传递给Integer而不是int Integer是一个对象,因此它正在列表中搜索该对象。 更改为:

public void eliminarPos(String var, String lex, String valor, int ii) {
    data.remove(ii);
}

按字符串remove数组将不起作用,因为list.remove在对象上调用equals() 在array.equals的情况下,它只是引用比较( == )。

按位置删除作品,您必须将正确的索引指定为原始int

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM