Java 清理后的列表包含空元素

Java 清理后的列表包含空元素,java,algorithm,list,Java,Algorithm,List,我有一个数据对象列表,它有一个结果列表。我想以相同的顺序将所有结果列表保存在另一个列表中。但是,某些结果元素列表为空 在获取所有字符串值之前,我正在清理列表: for (int i = 0; i < dataList.size(); i++) { if (dataList.get(i).getResultList() == null) { dataList.remove(i); } } 结果如下: java.lang

我有一个数据对象列表,它有一个结果列表。我想以相同的顺序将所有结果列表保存在另一个列表中。但是,某些结果元素列表为空

在获取所有字符串值之前,我正在清理列表:

    for (int i = 0; i < dataList.size(); i++) {
        if (dataList.get(i).getResultList() == null) {
            dataList.remove(i);
        }
    }
结果如下:

java.lang.IndexOutOfBoundsException:
at
ar\u List.get(i).add(dataList.get(i).getResultList().get(j).toString());

您正在使用导致问题的forLoop。而是使用迭代器删除列表中不需要的元素

for (E element : list) {
    // 1 - can call methods of element

    // ...
}
假设您有一个列表
[0:item,1:null,2:null,3:item]

循环1:无删除
[0:item,1:null,2:null,3:item]

循环2:删除索引1中的项“
[0:item,1:null,2:item]

循环3:没有删除,因为项@索引2有效
[0:item,1:null,2:item]


因此,当您在一个新的for循环中再次循环时,索引1处的null会导致NPE。

您使用的是导致问题的forLoop。而是使用迭代器删除列表中不需要的元素

for (E element : list) {
    // 1 - can call methods of element

    // ...
}
假设您有一个列表
[0:item,1:null,2:null,3:item]

循环1:无删除
[0:item,1:null,2:null,3:item]

循环2:删除索引1中的项“
[0:item,1:null,2:item]

循环3:没有删除,因为项@索引2有效
[0:item,1:null,2:item]


因此,当您在新for循环中再次循环时,索引1处的null会导致NPE。

问题在于删除部分。您正在删除列表项,因此您的列表将被更改,并且它将跳过某些项的清理。您可以使用迭代器或按如下方式向后删除项:

您可以替换:

   for (int i = 0; i < dataList.size(); i++) {
        if (dataList.get(i).getResultList() == null) {
            dataList.remove(i);
        }
    }

问题出在拆卸部件上。您正在删除列表项,因此您的列表将被更改,并且它将跳过某些项的清理。您可以使用迭代器或按如下方式向后删除项:

您可以替换:

   for (int i = 0; i < dataList.size(); i++) {
        if (dataList.get(i).getResultList() == null) {
            dataList.remove(i);
        }
    }
如果您有一个列表{“value”,null,null,“value”},那么在索引1处删除null,在索引1处将有另一个null,但您继续在索引2处检查

按索引删除对象时,以后必须减小索引。尝试
dataList.remove(i--)

如果您有一个列表{“value”,null,null,“value”},那么在索引1处删除null在索引1处将有另一个null,但您继续在索引2处检查

按索引删除对象时,以后必须减小索引。尝试
dataList.remove(i--)

问题源于您没有正确清理列表

每次删除空结果列表时,如果后面的列表也是空的,则不会对其进行检查

快速修复:

for (int i = 0; i < dataList.size(); i++) {
    if (dataList.get(i).getResultList() == null) {
        dataList.remove(i);
        i--;
    }
}
for(int i=0;i
更新:

List<List<String>> ar_List = new ArrayList<List<String>>();
List ar_List=new ArrayList();
当您使用it时,列表是空的,因此当您调用:
ar\u list.get(i)
Java将抛出一个IndexOutOfBoundsException,如javadoc中所述: >

得到

E get(整数索引)

返回此列表中指定位置的元素

参数: index-要返回的元素的索引

返回: 此列表中指定位置的元素

抛出: IndexOutOfBoundsException-如果索引超出范围(索引<0 | |索引>=size())


问题来自您没有正确清理列表的事实

每次删除空结果列表时,如果后面的列表也是空的,则不会对其进行检查

快速修复:

for (int i = 0; i < dataList.size(); i++) {
    if (dataList.get(i).getResultList() == null) {
        dataList.remove(i);
        i--;
    }
}
for(int i=0;i
更新:

List<List<String>> ar_List = new ArrayList<List<String>>();
List ar_List=new ArrayList();
当您使用it时,列表是空的,因此当您调用:
ar\u list.get(i)
Java将抛出一个IndexOutOfBoundsException,如javadoc中所述: >

得到

E get(整数索引)

返回此列表中指定位置的元素

参数: index-要返回的元素的索引

返回: 此列表中指定位置的元素

抛出: IndexOutOfBoundsException-如果索引超出范围(索引<0 | |索引>=size())


谢谢你的回答!有什么建议吗?@user503413问题是我得到了一个NPE,但是我的第一段代码显示我正在清理空元素列表。那么为什么我会得到一个NPE?你的答案是Thx编码,但我认为我仍然在做我的for循环。区别在哪里?谢谢你的回答!有什么建议吗?@user503413问题是我得到了一个NPE,但是我的第一段代码显示我正在清理空元素列表。那么为什么我会得到一个NPE?你的答案是Thx编码,但我认为我仍然在做我的for循环。区别在哪里?这是因为您的ar_列表没有任何项,并且您正试图在索引i处获取项。更正你的密码。谢谢你的回答!如果你能给我一些建议来解决这个问题,我将不胜感激。
for(int I=0;I
您可以删除null处理,因为我们现在已经清理了列表。这就是h