当前位置: 首页 > 面试题库 >

Java Collections-Map中的keyset()vs entrySet()

贺奕
2023-03-14
问题内容

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

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();
html" target="_blank">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()with itr2.next(),则迭代器没有几个键!


问题答案:

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

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

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

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


 类似资料:
  • 问题内容: 是否有与C ++等效的Java Map keySet()? Java 方法返回“此映射中包含的键的设置视图”。 问题答案: 也许以下可能有用: 使用STL兼容序列(例如std :: vector,std :: deque或std :: list)的 make_key_set 函数的重载可以如下所示:

  • 问题内容: 所有, 谁能让我确切知道两者之间的性能问题?站点:CodeRanch简要概述了使用keySet()和get()时需要的内部调用。但是如果使用keySet()和get()方法时,任何人都可以提供有关流的确切详细信息,那将是很好的。这将帮助我更好地了解性能问题。 问题答案: 首先,这完全取决于您使用的地图类型。但是,由于JavaRanch线程讨论了HashMap,因此我假设这就是您所指的实

  • 在此Map中获取一组键。 语法 (Syntax) Set keySet() 参数 (Parameters) 没有。 返回值 (Return Value) 钥匙套。 例子 (Example) 以下是此方法的使用示例 - class Example { static void main(String[] args) { def mp = ["TopicName" : "Maps

  • 如何过滤<代码>地图 仅当列表中的任何员工具有字段值性别=“M”时,我才必须过滤。 输入:

  • 问题内容: 考虑我创建一个LinkedHashMap,如下所示: 当我打电话给我时,有没有给我订购一套?如果我打电话给我,这些也是吗? 编辑 很抱歉,是有序的,没有排序。 问题答案: 首先是 有序 但没有 排序 。被 排序 (并因此 有序 以及)。 这就是说,你不能指望的输出,并进行排序。实际上,JavaDoc说 与订单无关 (事实证明,顺序 是 :由JavaDoc的保证是保证键和值从一个Link

  • 本文向大家介绍C ++ STL中的map :: at()和map :: swap(),包括了C ++ STL中的map :: at()和map :: swap()的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中map::at()和map::swap()函数的工作,语法和示例。 什么是C ++ STL中的映射? 映射是关联容器,它有助于按特定顺序存储由键值和映射值的组