Java Iterator无限循环仅迭代hashmap中的第1项

时间:2017-06-02 13:58:39

标签: java neo4j iterator

我正在执行数据库查询,结果我得到了一个HashMap。我想迭代所有结果,但我无限地将结果中的第一项添加到arraylist。

QueryResult result=engine.query(query,params);

while(result.iterator().hasNext()) {
    HashMap res= (HashMap)result.iterator().next();
    Node node=(Node)res.get("n");
    results.add(new BusyProfile(node));
}

如何遍历每个对象,为什么我有无限循环?谢谢!

5 个答案:

答案 0 :(得分:8)

每次拨打result.iterator()时,都会创建一个新的Iterator,指向第一个项目。

所以在循环之前创建它:

Iterator<?> it = result.iterator();
while (it.hasNext()) {
  HashMap res = (HashMap)it.next();
  //...
}

答案 1 :(得分:3)

你正在覆盖你的迭代器!当调用result.iterator()时,你会创建迭代器,但是在每次迭代时,它都会创建一个新的迭代器并继续指向开头 - 导致无限循环。

在这种情况下,您需要做的是保存迭代器,然后使用它来移动集合。

QueryResult result = engine.query(query,params);

//Save iterator
Iterator i = result.iterator();

while(i.hasNext()) {
    HashMap res = (HashMap)i.next();
    Node node   = (Node)res.get("n");
    results.add(new BusyProfile(node));
}
  

在通过迭代器访问集合之前,必须这样做   获得一个。每个集合类都提供一个迭代器()   将迭代器返回到集合开头的方法。通过   使用此迭代器对象,您可以访问该中的每个元素   集合,一次一个元素。

     

通常,使用迭代器循环遍历a的内容   集合,请按照以下步骤 -

     

通过调用获取集合开头的迭代器   collection的iterator()方法。

     

设置一个调用hasNext()的循环。让循环迭代   只要hasNext()返回true。

     

在循环中,通过调用next()来获取每个元素。

这里有一个快速教程: https://www.tutorialspoint.com/java/java_using_iterator.htm

答案 2 :(得分:2)

我之前发布的所有答案都解释说result.iterator()每次调用时都会实例化一个新的迭代器。
对于您正在迭代的同一个迭代器,在每次迭代期间创建一个迭代器是没有意义的:while(result.iterator().hasNext()) {
它是对的。

除了误用Iterator之外,你应该阅读你正在使用的类的javadoc。它通常可以帮助您创建更有效的代码 根据{{​​1}}的{​​{3}}, org.neo4j.ogm.session.result.QueryResult类以这种方式实现QueryResult接口Iterable

因此,不要做比要求更复杂的事情,只需使用增强型Iterable<Map<String,Object>> 它会产生更短,更易读的代码 此外,使用更受限制的变量范围更好,因为它阻止不适当地使用它 使用增强的for,您不再需要在循环之前声明迭代器。
它将在编译的类中使用(因为增强的for在引擎盖下使用迭代器)但它将被限制在循环的范围内。

所以你应该考虑这种方式:

for

答案 3 :(得分:1)

您应该调用iterator()方法一次,然后存储(并使用)返回的值。

答案 4 :(得分:1)

重用Iterator

Iterator i = result.iterator();
if(i.hasNext()) {
    HashMap res= (HashMap)i.next();
    Node node=(Node)res.get("n");
    results.add(new BusyProfile(node));
}