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:
atar\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