[英]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.