簡體   English   中英

Java Iterator無限循環僅迭代hashmap中的第1項

[英]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.QueryResultjavadocQueryResult類以這種方式實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM