java集合 - 地图中的keyset()与entrySet() [英] java collections - keyset() vs entrySet() in map

查看:41
本文介绍了java集合 - 地图中的keyset()与entrySet()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我把一个字符串数组元素是一个映射,其中字符串数组的元素是键,单词的频率是值,例如:

I put a string array elements is a map where elements of string array is key and frequency of word is value, e.g.:

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",委托"

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());
}

打印所有键值对:

使用条目集打印所有值:

Using entry set prints all values:

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

但下面的代码块应该打印与上面完全相同的输出,但它没有:

But the block of code below should print exactly the same output as above, but it does not:

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 行,即

But if we uncomment line 1 in the while loop i.e

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","到","委托"};

Then we get all keys: {"if","it","is","to","be","it","is","up","me","to","delegate"};

如果我们将 m.get()itr2.next() 一起使用,那么迭代器没有几个键!

If we use m.get() with itr2.next(), then the iterator does not have few keys!

推荐答案

每次调用 Iterator.next() 都会将迭代器移动到下一个元素.如果要在多个语句或表达式中使用当前元素,则必须将其存储在局部变量中.或者更好的是,您为什么不简单地使用 for-each 循环?

Every call to the Iterator.next() moves the iterator to the next element. If you want to use the current element in more than one statement or expression, you have to store it in a local variable. Or even better, why don't you simply use a for-each loop?

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

此外,遍历 entrySet 更快,因为您不会为每个键查询两次映射.此外,Map.Entry 实现通常实现 toString() 方法,因此您不必手动打印键值对.

Moreover, loop over the entrySet is faster, because you don't query the map twice for each key. Also Map.Entry implementations usually implement the toString() method, so you don't have to print the key-value pair manually.

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

这篇关于java集合 - 地图中的keyset()与entrySet()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆