Iterator似乎丢失了数据java

时间:2015-09-26 05:15:09

标签: java arraylist iterator hashmap

我有一个方法可以返回一个hashmaps列表(数据来自ResultSet)。 在尝试使用迭代器循环数据并将其转换为String数组时,我发现代码无法正常工作 - 在执行循环时似乎丢失了一半的数组数据。

当交换使用for循环而不是迭代器时,数据不会丢失。我尝试同时使用Iterator()ListIterator()无效

这是我的原始代码(不起作用):

public String[][] getLayoutEdges() throws SQLException {
    ArrayList<String[]> returnArray = new ArrayList<>();

    List<HashMap> layoutEdges = db.getLayoutEdgesFromDatabase();
    ListIterator<HashMap> edgesIterator = layoutEdges.listIterator();

    while(edgesIterator.hasNext()) {
        ArrayList<String> tmpList = new ArrayList<>();
        tmpList.add(edgesIterator.next().get("fromnode").toString());
        tmpList.add(edgesIterator.next().get("tonode").toString());
        tmpList.add(edgesIterator.next().get("distance").toString());

        String[] tmpStr = new String[tmpList.size()];
        returnArray.add(tmpList.toArray(tmpStr));

    } 

    String[][] rtn = new String[returnArray.size()][returnArray.size()];
    return returnArray.toArray(rtn);
}

以下是可行的代码:

public String[][] getLayoutEdges() throws SQLException {
    ArrayList<String[]> returnArray = new ArrayList<>();

    List<HashMap> layoutEdges = db.getLayoutEdgesFromDatabase();

    for(HashMap tmp : layoutEdges) {
        ArrayList<String> tmpList = new ArrayList<>();
        tmpList.add(tmp.get("fromnode").toString());
        tmpList.add(tmp.get("tonode").toString());
        tmpList.add(tmp.get("distance").toString());

        String[] tmpStr = new String[tmpList.size()];
        returnArray.add(tmpList.toArray(tmpStr));
    }

    String[][] rtn = new String[returnArray.size()][returnArray.size()];
    return returnArray.toArray(rtn);
}

有人能告诉我为什么迭代器不起作用吗?我可以使用for循环,但我无法解释为什么我写的原始迭代器代码并不能保留我的所有数据。想知道我是否缺少了一个步骤,或者我是否试图使用错误的解决方案。

2 个答案:

答案 0 :(得分:4)

您在第一个代码段中循环的每次迭代都会调用edgesIterator.next()三次,我非常确定您不想这样做。不要那样做:

while (edgesIterator.hasNext()) {
    HashMap tmp = edgesIterator.next();
    tmpList.add(tmp.get("fromnode").toString());
    tmpList.add(tmp.get("tonode").toString());
    tmpList.add(tmp.get("distance").toString());
    String[] tmpStr = new String[tmpList.size()];
    returnArray.add(tmpList.toArray(tmpStr));
}

顺便说一句,如果您可以避免在API中使用原始类型,那么通常会更清晰 - 我在这里谈论HashMap的使用。

我通常也会喜欢你的代码的第二个版本 - 除非你需要出于某种原因显式使用迭代器,让增强for循环的语法糖自动为你做。

答案 1 :(得分:1)

由于这些原因:

tmpList.add(edgesIterator.next().get("fromnode").toString());
tmpList.add(edgesIterator.next().get("tonode").toString());
tmpList.add(edgesIterator.next().get("distance").toString());

当你调用edgesIterator.next()时,它会将光标移动到下一个元素。