【问题标题】:For each loop works, but iterator does not对于每个循环都有效,但迭代器不
【发布时间】:2013-01-21 02:49:06
【问题描述】:

编写一个方法counts,它接受整数的List 和整数的Set 作为参数,并返回从集合中的每个值到列表中该值出现次数的映射。

我的解决方案 #1:

public static Map<Integer, Integer> counts(List<Integer> list, Set<Integer> set) {
    Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
    Iterator<Integer> i = list.iterator();

    for(Integer element : set) {
        int count = 0;
        for(Integer sub : list) {
            if(sub == element) {
                count++;
            }
        }
        map.put(element, count);
    }

    return map;
}

我的解决方案 #2:

public static Map<Integer, Integer> counts(List<Integer> list, Set<Integer> set) {
    Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
    Iterator<Integer> i = list.iterator();

    for(Integer element : set) {
        int count = 0;
        while(i.hasNext()) {
            if(i.next() == element) {
                count++;
            }
        }
        map.put(element, count);
    }

    return map;
}

输入:

list: [4, -2, 3, 9, 4, 17, 5, 29, 14, 87, 4, -2, 100]
set: [-2, 4, 29]

预期输出:

{-2=2, 4=3, 29=1}

#1 的输出:

{-2=2, 4=3, 29=1}

#2 的输出:

{-2=0, 4=3, 29=0}

第一个有效,但第二个无效。为什么?它们本质上是一样的,还是我错过了什么?另外,使用for 循环可以遍历列表吗?如果不是,为什么?

【问题讨论】:

  • 不同的方法做什么或不做什么,你的预期输出是什么?
  • 您确定要通过引用进行比较吗?
  • 在一种情况下,您的迭代器在外循环内隐式声明,在另一种情况下,它在外部显式声明...
  • 不回答您的问题,但有更好的方法:遍历列表,如果集合包含该元素,则对于列表中的每个元素更新您的地图。 (您必须检查 null 值,或使用 for( Integer i : set ) map.put( i, 0 ); 初始化您的 Map
  • @Danyel 感谢您的建议,但我不明白这个解决方案如何/为什么更好?

标签: java for-loop foreach iterator


【解决方案1】:

您忘记在每次循环后重置迭代器,请尝试以下操作:

for(Integer element : set) {
    int count = 0;
    i = list.iterator(); // resets the iterator to the first element. 
    while(i.hasNext()) {
        if(i.next() == element) {
            count++;
        }
    } // by the end of this loop the iterator has no next elements, need to reset.
    map.put(element, count);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多