37

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

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

打印所有键值对:

使用 entry set 打印所有值:

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()with itr2.next(),那么迭代器没有几个键!

4

5 回答 5

53

每次调用 都会Iterator.next()将迭代器移动到下一个元素。如果要在多个语句或表达式中使用当前元素,则必须将其存储在局部变量中。或者更好的是,你为什么不简单地使用一个 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);
}
于 2012-01-22T16:36:07.203 回答
3

每次你调用 itr2.next() 你都会得到一个不同的值。值不一样。您应该只在循环中调用一次。

Iterator<String> itr2 = keys.iterator();
    while(itr2.hasNext()){
        String v = itr2.next();
        System.out.println("Key: "+v+" ,value: "+m.get(v));
    }
于 2012-01-22T16:17:07.220 回答
2

在大地图上的遍历entrySet()keySet(). 查看教程他们如何在 ) 的帮助下优化对大对象的遍历entrySet(以及它如何有助于性能调整。

于 2014-03-11T05:07:42.157 回答
1

Iterator仅向前移动,如果它读取一次,它就完成了。您的

m.get(itr2.next());

正在读取 的下一个值itr2.next();,这就是为什么您缺少几个(实际上不是几个,每隔一个)键。

于 2012-01-22T16:14:51.493 回答
0

为简单起见,请注意,每次您执行itr2.next()此操作时,指针都会移动到下一个元素,即此处,如果您仔细注意,那么根据您编写的逻辑,输出是完全正常的。
这可以帮助您更好地理解:

While循环的第一次迭代(指针在第一个元素之前):
键:if,值:2 {itr2.next()=if; m.get(itr2.next()=it)=>2}

While 循环的第二次迭代(指针在第三个元素之前):
键:是,值:2{itr2.next()=is; m.get(itr2.next()=to)=>2}

While 循环的第 3 次迭代(指针在第 5 个元素之前):
键:be ,值:1{itr2.next()="be"; m.get(itr2.next()="up")=>"1"}

While循环的第4次迭代(指针在第7个元素之前):
键:me,值:1{itr2.next()="me"; m.get(itr2.next()="delegate")=>"1"}

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 :委托,价值:1

它打印:

键:如果,值:2
键:是,值:2
键:是,值:1
键:我,值:1

于 2016-12-07T07:22:07.820 回答