使用迭代器遍历 HashMap 不会因 if 条件而停止

Looping through a HashMap using iterator does not stop for an if condition

提问人:user2817235 提问时间:11/15/2023 最后编辑:Ivaruser2817235 更新时间:11/17/2023 访问量:107

问:

A 有 10 个条目,但我只想打印 3 个条目。HashMap<Integer, Integer>

法典:

HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
hm.put(2, 1);
hm.put(5, 3);
hm.put(7, 2);
hm.put(4, 1);
hm.put(6, 3);
hm.put(8, 2);
hm.put(9, 1);
hm.put(3, 3);
hm.put(1, 2);       
hm.put(0, 2);
Iterator <Map.Entry<Integer, Integer>> itr = hm.entrySet().iterator();
int n=4;
int i=0;
while(itr.hasNext()){
    if(i<n){
        Map.Entry<Integer, Integer> entry = itr.next();
        System.out.println(entry.getKey()+" repeated "+entry.getValue());
    }
    i++;
}

输出

0 repeated 2
1 repeated 2
2 repeated 1
3 repeated 3 //program will wait for 2 or 3 seconds here
4 repeated 1
5 repeated 3
6 repeated 3
7 repeated 2
8 repeated 2
9 repeated 1

预期输出:

0 repeated 2
1 repeated 2
2 repeated 1
3 repeated 3

为什么 while-loop 中的 if 条件不起作用?

Java IF-语句 while-loop 哈希图 迭代器

评论

2赞 maloomeister 11/15/2023
提示:在循环内打印。你认为发生了什么?i

答:

5赞 Thiyagu 11/15/2023 #1

一旦变成 4,您就不会退出循环。此外,您不会像在 if 块中那样使用/读取迭代器中的后续元素。因此,它不断递增,直到溢出到 (-2147483648),这需要几秒钟(您已经观察到)。iitr.next()iInteger.MIN_VALUE

此时,if 块的条件变为 true (),因此它开始从迭代器打印其他元素。i < n

您可以打印 的值来查看此值。i

System.out.println(entry.getKey()+" repeated "+entry.getValue() +". The value of i is: " + i);

指纹

0 repeated 2. The value of i is: 0
1 repeated 2. The value of i is: 1
2 repeated 1. The value of i is: 2
3 repeated 3. The value of i is: 3
4 repeated 1. The value of i is: -2147483648
5 repeated 3. The value of i is: -2147483647
6 repeated 3. The value of i is: -2147483646
7 repeated 2. The value of i is: -2147483645
8 repeated 2. The value of i is: -2147483644
9 repeated 1. The value of i is: -2147483643

评论

0赞 user2817235 11/15/2023
请帮助我理解为什么它不断增加,直到溢出到Integer.MIN_VALUE (-2147483648)?而不是 Integer.MAX_VALUE(2147483647),因为我们要加 (++) ,而不是减法 (--)
2赞 Thomas Kläger 11/15/2023
@user2817235Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
1赞 Lajos Arpad 11/15/2023 #2

当达到条件时,条件将无限增加,而迭代器不会单步执行下一个条件。在某个时候,由于数字溢出,迭代开始变得比小(但很多时候迭代是经过的,而在此期间没有进入下一个迭代),然后你的循环以一种不希望的方式结束。您将需要iniffalseiin

} else {
    itr.next();
}

或者以某种方式改变循环的条件,这样当它不再有意义时,它就不会继续工作。

1赞 Ahmed Mera 11/17/2023 #3

你必须移出 if iter.next(),所以解决方案是:

import java.util.*;

public class Main {
  public static void main(String[] args) {
HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
hm.put(2, 1);
hm.put(5, 3);
hm.put(7, 2);
hm.put(4, 1);
hm.put(6, 3);
hm.put(8, 2);
hm.put(9, 1);
hm.put(3, 3);
hm.put(1, 2);       
hm.put(0, 2);
Iterator <Map.Entry<Integer, Integer>> itr = hm.entrySet().iterator();
int n=4;
int i=0;
while(itr.hasNext()){
       Map.Entry<Integer, Integer> entry = itr.next();
    if(i<n){
        System.out.println(entry.getKey()+" repeated "+entry.getValue());
    }
 
    i++;
}
  }
}

OUTOUT是:

0 repeated 2
1 repeated 2
2 repeated 1
3 repeated 3