[英]Java Iterator infinite loop iterates only the 1st item in hashmap
我正在執行數據庫查詢,結果我得到了一個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));
}
如何遍歷每個對象,為什么我有無限循環? 謝謝!
每次調用result.iterator()
,都會創建一個新的Iterator,指向第一個項目。
所以在循環之前創建它:
Iterator<?> it = result.iterator();
while (it.hasNext()) {
HashMap res = (HashMap)it.next();
//...
}
你正在覆蓋你的迭代器! 當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));
}
在通過迭代器訪問集合之前,必須先獲取一個集合。 每個集合類都提供了一個iterator()方法,該方法將迭代器返回到集合的開頭。 通過使用此迭代器對象,您可以訪問集合中的每個元素,一次一個元素。
通常,要使用迭代器循環遍歷集合的內容,請按照下列步驟操作 -
通過調用集合的iterator()方法獲取集合開頭的迭代器。
設置一個調用hasNext()的循環。 只要hasNext()返回true,就循環迭代。
在循環中,通過調用next()獲取每個元素。
這里有一個快速教程: https : //www.tutorialspoint.com/java/java_using_iterator.htm
在我之前發布的所有答案都解釋了result.iterator()
每次調用時都會實例化一個新的迭代器。
對於您正在迭代的相同迭代器,在每次迭代期間創建迭代器是沒有意義的: while(result.iterator().hasNext()) {
。
這是正確的。
除了誤用Iterator
,你應該閱讀你正在使用的類的javadoc。 它通常可以幫助您創建更有效的代碼。
根據org.neo4j.ogm.session.result.QueryResult
的javadoc , QueryResult
類以這種方式實現Iterable
接口Iterable<Map<String,Object>>
。
因此,而不是做的事情比要求更復雜,只是使用增強for
。
它會產生更短且更易讀的代碼。
此外,使用更受限制的變量范圍更好,因為它可以防止不合適地使用它。
使用增強的for,您不再需要在循環之前聲明迭代器。
它將在編譯的類中使用( for
在迭代器下使用而增強)但它將被限制在循環的范圍內。
所以你應該考慮這種方式:
QueryResult result = engine.query(query,params);
for (Map<String,Object> currentMap : result) {
Node node = (Node) currentMap.get("n");
results.add(new BusyProfile(node));
}
您應該調用iterator()
方法一次,然后存儲(並使用)返回的值。
重用迭代器
Iterator i = result.iterator();
if(i.hasNext()) {
HashMap res= (HashMap)i.next();
Node node=(Node)res.get("n");
results.add(new BusyProfile(node));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.