迭代器似乎正在丢失java数据

迭代器似乎正在丢失java数据,java,arraylist,iterator,hashmap,Java,Arraylist,Iterator,Hashmap,我有一个方法返回一个hashmaps列表(数据来自ResultSet)。 在尝试使用迭代器循环数据并将其转换为字符串数组时,我发现代码不起作用-在执行循环时,它似乎丢失了一半的数组数据 当将其交换为使用for循环而不是迭代器时,数据不会丢失。我尝试使用迭代器()和列表迭代器() 这是我的原始代码(不起作用): 公共字符串[][]GetLayoutGes()抛出SQLException{ ArrayList returnArray=新的ArrayList(); List layoutEdges=d

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

当将其交换为使用for循环而不是迭代器时,数据不会丢失。我尝试使用
迭代器()
列表迭代器()

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

公共字符串[][]GetLayoutGes()抛出SQLException{
ArrayList returnArray=新的ArrayList();
List layoutEdges=db.getLayoutEdgesFromDatabase();
ListIterator edgesIterator=layoutteges.ListIterator();
while(edgesIterator.hasNext()){
ArrayList tmpList=新的ArrayList();
tmpList.add(edgesIterator.next().get(“fromnode”).toString());
tmpList.add(edgesIterator.next().get(“tonode”).toString());
tmpList.add(edgesIterator.next().get(“distance”).toString());
字符串[]tmpStr=新字符串[tmpList.size()];
returnArray.add(tmpList.toArray(tmpStr));
} 
字符串[][]rtn=新字符串[returnArray.size()][returnArray.size()];
返回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);
}
公共字符串[][]GetLayoutGes()抛出SQLException{
ArrayList returnArray=新的ArrayList();
List layoutEdges=db.getLayoutEdgesFromDatabase();
for(HashMap tmp:layoutteges){
ArrayList tmpList=新的ArrayList();
tmpList.add(tmp.get(“fromnode”).toString());
tmpList.add(tmp.get(“tonode”).toString());
tmpList.add(tmp.get(“distance”).toString());
字符串[]tmpStr=新字符串[tmpList.size()];
returnArray.add(tmpList.toArray(tmpStr));
}
字符串[][]rtn=新字符串[returnArray.size()][returnArray.size()];
返回returnArray.toArray(rtn);
}

谁能告诉我迭代器为什么不工作?我可以使用for循环,但我一辈子都搞不懂为什么我编写的原始迭代器代码没有保留所有数据。想知道我是否遗漏了一个步骤,或者我是否尝试使用了错误的解决方案。

您正在为第一个代码段中的循环每次迭代调用
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循环的语法糖自动为您执行此操作。

因为有以下几行代码:

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

调用edgesIterator.next()的那一刻就是将光标移动到下一个元素。

正如我所怀疑的那样……一个愚蠢的疏忽。这是完全有道理的-谢谢你的及时回复!为什么您建议避免使用原始类型,我可以将它们定义为
List
List
?(Netbeans告诉我这是一个错误)@cynepoba12:Raw类型会丢失类型信息,这意味着您必须到处强制转换或调用
toString()
。(假设您的映射实际上是一个
map
,您可以删除所有
toString()
调用。)您需要为
HashMap
指定两个类型参数,因为它有键和值-我个人会使用
List
,而不是显式地使用
HashMap
。如果不了解更多,就很难给出完整的代码,但我建议您进行实验。
布局
是一个
列表
-它没有
入口集()
。虽然OP不需要使用
listIterator()
,但他们的操作方式没有问题。
tmpList.add(edgesIterator.next().get("fromnode").toString());
tmpList.add(edgesIterator.next().get("tonode").toString());
tmpList.add(edgesIterator.next().get("distance").toString());