我正在执行数据库查询,结果我得到了一个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));
}
如何遍历每个对象,为什么我有无限循环?谢谢!
答案 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));
}