当前位置: 首页>>编程语言>>正文


java集合– keyset() vs entrySet()在Map上

旱地渔夫 编程语言 , , , , 去评论

问题描述

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

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

那么Map将会有类似[ 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实现通常实现toString()方法,因此您不必手动打印key-value对。

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

第三种解决方法

穿越大MapentrySet()keySet()好多了。在entrySet(的帮助下,检查this教程,了解如何优化遍历大型对象)以及它对性能调优的帮助。

参考文献

注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。

本文由《共享笔记》整理, 博文地址: https://gxnotes.com/article/191576.html,未经允许,请勿转载。
Go