清理列表具有null元素

时间:2014-02-06 12:17:42

标签: java algorithm list

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

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

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

然后我想写入另一个列表:

//double List to String
List<List<String>> ar_List = new ArrayList<List<String>>();
for (int i = 0; i < dataList.size(); i++) {
    for (int j = 0; j < dataList.get(i).getResultList().size(); j++) {
        if(dataList.get(i).getResultList().get(j) != null) {
            ar_List.get(i).add(dataList.get(i).getResultList().get(j).toString());
        } else {
            ar_List.get(i).add("null");
        }
    }
}

但是我在NullPointerException获得了if(dataList.get(i).getResultList().get(j) != null) {。那是因为一些dataList对象是null。然而,这是不可能的,因为我之前清理了清单。有什么建议吗?

感谢您的回答!

更新

使用:

    for (int i = dataList.size()-1; i >=0 ; i--) {
        if (dataList.get(i).getResultList() == null) {
            dataList.remove(i);
        }
    }

            List<List<String>> ar_List = new ArrayList<List<String>>();
    for (int i = 0; i < dataList.size(); i++) {
        for (int j = 0; j < dataList.get(i).getResultList().size(); j++) {
            if(dataList.get(i).getResultList().get(j) != null) {
                ar_List.get(i).add(dataList.get(i).getResultList().get(j).toString());
            } else {
                ar_List.get(i).add("null");
            }
        }
    }

结果是:

java.lang.IndexOutOfBoundsException:

ar_List.get(i).add(dataList.get(i).getResultList().get(j).toString());

4 个答案:

答案 0 :(得分:2)

问题在于删除部分。您正在删除列表项,以便您的列表将被更改,它将跳过一些清除的项目。您可以使用迭代器或向下移除项目,如下所示:

您可以替换:

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

   for (int i = dataList.size()-1; i >=0 ; i--) {
        if (dataList.get(i).getResultList() == null) {
            dataList.remove(i);
        }
    }

答案 1 :(得分:1)

您正在使用导致问题的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:删除项目@ index 1'[0:item, 1:null, 2: item]

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

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

答案 2 :(得分:1)

问题来自于您没有正确清理清单。

每次删除空结果列表时,如果之后的那个也为空,则不会检查它。

快速修复:

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

更新:

List<List<String>> ar_List = new ArrayList<List<String>>();

当你使用它时,列表是空的,所以当你调用:ar_List.get(i) Java将抛出一个如javadoc中所述的IndexOutOfBoundsException: &GT;

  

获取

     

E get(int index)

     

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

     

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

     

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

     

抛出:          IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; = size())

答案 3 :(得分:0)

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

当您通过索引删除对象时,您将不得不在之后递减索引。尝试 dataList.remove(i--);