从List <string []>中删除元素不能按预期工作

时间:2016-10-06 16:52:14

标签: java string arraylist

我有一个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数组?

3 个答案:

答案 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而不是intInteger是一个对象,因此它在列表中搜索该对象。将其更改为:

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

答案 2 :(得分:1)

String数组的

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);
}