簡體   English   中英

java集合 - mapset中的keyset()vs entrySet()

[英]java collections - keyset() vs entrySet() in map

我把一個字符串數組元素是一個映射,其中字符串數組的元素是鍵,字的頻率是值,例如:

String[] args = {"if","it","is","to","be","it","is","up","me","to","delegate"};

然后地圖將有[ if:1, it:2 .... ]等條目

Set<String> keys = m.keySet();
System.out.println("keyset of the map : "+keys);

打印所有鍵: "if","it","is","to","be","it","is","up","me","to","delegate"

Set<Map.Entry<String, Integer>> entrySet = m.entrySet();
Iterator<Map.Entry<String, Integer>> i = entrySet.iterator();
while(i.hasNext()){
    Map.Entry<String, Integer> element = i.next();
    System.out.println("Key: "+element.getKey()+" ,value: "+element.getValue());
}

打印所有鍵值對:

使用條目集打印所有值:

Key: if ,value: 1
Key: it ,value: 2
Key: is ,value: 2
Key: to ,value: 2
Key: be ,value: 1
Key: up ,value: 1
Key: me ,value: 1
Key: delegate ,value: 1

但是下面的代碼塊應該打印與上面完全相同的輸出,但它不會:

Iterator<String> itr2 = keys.iterator();
while(itr2.hasNext()){
    //System.out.println(itr1.next()+" ");
    //System.out.println(m.get(itr1.next())+" ");
    System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));
}

它打印:

Key: if ,value: 2
Key: is ,value: 2
Key: be ,value: 1
Key: me ,value: 1

但是如果我們在while循環中取消注釋第1行,即

System.out.println(itr1.next()+" ");

並評論該行

System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));

然后我們得到所有鍵: {"if","it","is","to","be","it","is","up","me","to","delegate"};

如果我們使用m.get()itr2.next() ,那么迭代器沒有幾個鍵!

每次調用Iterator.next()將迭代器移動到下一個元素。 如果要在多個語句或表達式中使用當前元素,則必須將其存儲在局部變量中。 或者甚至更好,為什么不簡單地使用for-each循環?

for (String key : map.keySet()) {
    System.out.println(key + ":" + map.get(key));
}

此外,entrySet上的循環更快,因為您不會為每個鍵查詢兩次映射。 Map.Entry實現通常Map.Entry實現toString()方法,因此您不必手動打印鍵值對。

for (Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry);
}

每次調用itr2.next()時,您都會獲得一個獨特的值。 價值不一樣。 你應該只在循環中調用一次。

Iterator<String> itr2 = keys.iterator();
    while(itr2.hasNext()){
        String v = itr2.next();
        System.out.println("Key: "+v+" ,value: "+m.get(v));
    }

遍歷大型map entrySet()keySet()要好得多。 查看教程,他們如何借助entrySet( )優化對大對象的遍歷以及它如何幫助進行性能調優。

Iterator只向前移動,如果它只讀一次,它就完成了。 您的

m.get(itr2.next());

正在讀取itr2.next();的下一個值itr2.next(); ,這就是為什么你缺少一些(實際上不是幾個,每一個)鍵。

為了簡單itr2.next() ,請注意,每次執行itr2.next() ,指針都會移動到下一個元素,即如果您仔細注意,那么根據您編寫的邏輯輸出完全正常。
這可以幫助您更好地理解:

While循環的第一次迭代(指針在第一個元素之前):
密鑰:if,value:2 {itr2.next()=if; m.get(itr2.next()=it)=>2} {itr2.next()=if; m.get(itr2.next()=it)=>2}

While循環的第二次迭代(指針在第3個元素之前):
鍵:是,值:2 {itr2.next()=is; m.get(itr2.next()=to)=>2} {itr2.next()=is; m.get(itr2.next()=to)=>2}

While循環的第3次迭代(指針在第5個元素之前):
關鍵:be,value:1 {itr2.next()="be"; m.get(itr2.next()="up")=>"1"} {itr2.next()="be"; m.get(itr2.next()="up")=>"1"}

While循環的第四次迭代(指針在第7個元素之前):
關鍵:我,價值:1 {itr2.next()="me"; m.get(itr2.next()="delegate")=>"1"} {itr2.next()="me"; m.get(itr2.next()="delegate")=>"1"}

關鍵:if,value:1
關鍵:它,價值:2
關鍵:是,價值:2
關鍵:to,value:2
關鍵:是,價值:1
關鍵:上,值:1
關鍵:我,價值:1
關鍵:委托,價值:1

它打印:

關鍵:if,value:2
關鍵:是,價值:2
關鍵:是,價值:1
關鍵:我,價值:1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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