【问题标题】:looping through Hashmap with Iterator使用迭代器循环遍历 Hashmap
【发布时间】:2019-07-28 09:22:19
【问题描述】:

我正在尝试计算 java 8 中哈希图的所有值的 mod 总和。但它没有按预期提供。下面是我写的代码。

private static int FindPairs(int n,int[] ar) {
    Map<Integer, Integer> countermap=new HashMap<>();
    Iterator<Integer> itr=countermap.keySet().iterator();
    int result =0;
    for(int i=0;i<ar.length;i++) {
        if(countermap.containsKey(ar[i])) {
            countermap.put(ar[i], countermap.get(ar[i])+1);
        }
        else {
            countermap.put(ar[i], 1);
        }
    }
    int mod=0;

    while(itr.hasNext()) {
        System.out.println(itr.next());
        mod=itr.next()%2;
        result=result + mod;
    }
    System.out.println(Arrays.asList(countermap));
    return result;
}

输入:

ar= {1,2,3,4,5,6,1,3,4,5}

n=7

输出:

[{1=2, 2=1, 3=2, 4=2, 5=2, 6=1}]

0

【问题讨论】:

  • 为什么n 从未在任何地方使用过?你能澄清一下你的期望吗?
  • n不是在方法中没有使用吗!?
  • 是的,我在故障排除时使用了 array.length。我正在尝试对给定数组中可能的重复值对进行计数。
  • 第一个循环可以写成for(int value: ar) countermap.marge(value, 1, Integer::sum);,然后是第二个for(int next: countermap.keySet()) { System.out.println(next); result += next % 2; },对于最后的打印语句,不需要将地图包装在一个列表中,System.out.println(countermap); 就可以了,除非输出周围的[] 至关重要。
  • sysout 仅用于故障排除目的。另外我想处理值而不是键 keyset() 将从地图返回一组键。基本上我想遍历地图寻找 (value%2) 的 mod 并将其添加到结果变量中

标签: java java-8 hashmap iterator


【解决方案1】:

我在您发布的代码中发现了两个问题

  1. 您的迭代器必须在您的HashMap 被填充后创建。否则永远是空的

    Iterator<Integer> itr = countermap.keySet().iterator(); <---- HERE
    while (itr.hasNext()) {
        System.out.println(itr.next());
        mod = itr.next()% 2;
        result = result + mod;
    }
    
  2. 此外,连续两次调用itr.next() 将一直跳过一个。您应该调用一次,将其存储在变量中,然后根据需要使用两次

    Iterator<Integer> itr = countermap.keySet().iterator();
    while (itr.hasNext()) {               _
        Integer next = itr.next();         |
        System.out.println(next);           }<---- HERE
        mod = next % 2;                   _|
        result = result + mod;
    }
    

通过这些更改,输出变为以下内容

1
2
3
4
5
6
[{1=2, 2=1, 3=2, 4=2, 5=2, 6=1}]
3

【讨论】:

  • 我认为问题在于在 hashmap 之前有迭代器声明,谢谢
  • 或者只使用标准循环习语for(Integer next: countermap.keySet()) { System.out.println(next); mod = next % 2; result = result + mod; },它会自动指导正确使用局部变量。
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2018-10-15
  • 2020-08-20
  • 2011-10-08
相关资源
最近更新 更多