我有一个String数组的StringList,它被添加到这样:
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数组?
答案 0 :(得分:6)
如果您查看Javadocs,您会发现remove
有两种不同的重载方法。一个采用Object,另一个采用原始整数作为位置:
<强>
remove
强>
public E remove(int index)
删除此列表中指定位置的元素。将任何后续元素向左移位(从索引中减去一个)。
以上采用原始整数,下面采用对象:
<强>
remove
强>
public boolean remove(Object o)
从此列表中删除指定元素的第一个匹配项(如果存在)。如果列表不包含该元素,则不会改变...
您看到false
的原因是因为您提供了原始int
的包装类。 Integer
是 Object ,因此Java使用的方法与您调用它的方式非常相似,在这种情况下,您使用Object参数调用。然后,Java使用方法签名remove(Object o)
,并且由于ArrayList中不存在指定的Integer
,因此它返回false
。
现在,后者失败的原因是您创建了一个新的String数组,因此创建了一个新实例。由于new String[] { var, lex, valor }
和new String[] { var, lex, valor }
不是引用相等,因此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
remove(Object o)
}。
答案 1 :(得分:3)
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);
}
答案 2 :(得分:1)
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);
}