将字符串数组转换为列表并删除字符串会产生FATAL EXCEPTION

时间:2016-05-21 14:32:17

标签: android arrays arraylist

在我的Android Applicatio中,我有一个字符串数组,我想从中删除字符串。

List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory));
        for (int i = 0; i < dishCategory.length; i++) {
            if (dishCategory[i].equals("Beilagen")) {
                categoryList.remove(i);
            }
            String[] dishCategory = categoryList.toArray(new String[categoryList.size()]);
        }

但是当我尝试它时,它会给予:

 FATAL EXCEPTION: main
    Process: de.hswt.fuca, PID: 19818
   java.lang.IndexOutOfBoundsException: Invalid index 14, size is 13
 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.remove(ArrayList.java:403)

4 个答案:

答案 0 :(得分:3)

这是因为您正在修改迭代的List。如果您的List长达2个项目,那么出现问题的一个例子是:

["Beilagen", "Beilagen"]

第一次迭代删除索引0处的项目。这会修改List,使其看起来像这样:

["Beilagen"]

然后第二次迭代想要删除索引1处的项目,但列表的长度为1,这样就会产生IndexOutOfBoundsException,就像你看到的那样。

对此进行快速而肮脏的修复可能是为了使您想要在删除期间修改的变量迭代的项目数量如此:

List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory));
int upperLimit = dishCategory.length;
for (int i = 0; i < upperLimit; i++) {
    if (dishCategory[i].equals("Beilagen")) {
        categoryList.remove(i);
        upperLimit--;
        i--;
    }
    String[] dishCategory = categoryList.toArray(new String[categoryList.size()]);
}

但如果您想要干净的代码,我建议您使用listIterator(),因为它是为了这种目的而制作的。

答案 1 :(得分:0)

我的建议是使用属于Iterator的内置ArrayList来遍历数组。这是一个简单的实现,可以满足您的需求。完成删除所有元素后,还要将List更改回数组。这将使您的运行时O(n)而不是当前的O(n^2)

List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory));
Iterator<String> i = categoryList.iterator();
while (i.hasNext()) {
   String s = i.next();
   if (s.equals("Beilagen")) {
       i.remove();
   }
}
String [] dishCategory = categoryList.fromArray(String[categoryList.size()]); 

如果您Iterators未将for loop的限制更改为List.size(),那么您的for loop的粉丝也会有效,因为每次通过{i--都会对其进行重新评估但是,由于在删除后重新评估索引,因此需要List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory)); for (int i = 0; i < categoryList.size(); i++) { if (categoryList.get(i).equals("Beilagen")) { categoryList.remove(i); i--; } } String [] dishCategory = categoryList.fromArray(String[categoryList.size()]); 。这是代码:

       For Each Cell In Range("A19:A" & lastRow)
            If Mid(Cell, 5, 1) <> "*" Then Cell.EntireRow.Delete

答案 2 :(得分:0)

LOVE_LOB

答案 3 :(得分:-1)

变化:

for (int i = 0; i < dishCategory.length; i++) {

为:

for (int i = 0; i < dishCategory.length - 1; i++) {

请记住,所有数组都是0索引的,因此您的索引永远不会与结构的实际长度一样大。