在for循环中同时迭代map和array

时间:2009-11-14 03:28:10

标签: java collections for-loop variadic-functions foreach

我在构造函数中创建for循环时遇到了一些问题,无法同时迭代地图和数组。 Here,表明使用增强的for循环无法做到这一点。

我有类似的东西,这会引发编译错误。基本上,该类有一个Map,我想通过构造函数填充它,该构造函数将一个集合和一个可变数量的整数作为参数。

var-arg表达式求值为整数数组,所以我试图将两个增强迭代器放在同一个循环中,但是没有用。

private final Map<Module, Integer> modules = new HashMap<Module, Integer>();    
    AssemblyType(Collection<Module> modules, int... units) {
        int i = 0;
        for (Module module : modules, int i : units) {
            this.modules.put(module, units[i]);
        }       
    }

感谢有关如何继续的任何想法。

3 个答案:

答案 0 :(得分:2)

这样做的天真方法就是自己跟踪i

private final Map modules = new HashMap();    
    AssemblyType(Collection modules, int... units) {
        int i = 0;
        for (Module module : modules) {
                this.modules.put(ingredient, units[i]);
                i++;
        }               
    }

我不确定是否有更好的方法,但我很确定你不能像原始示例一样在单个for循环中组合两个迭代器。

答案 1 :(得分:0)

看起来您试图将模块Map作为Collection传递,这会导致编译错误。

迭代两者的代码可能是这样的

public MyMethod(Map<Object, Object> objectMap, Integer ... intArray) {
    if( intArray.length != ObjectMap.size() ) {
       //However you want to handle this case
    }
    Iterator<Object> mapKeyIterator = objectMap.keySet().iterator();
    Iterator<Integer> integerIterator = Arrays.asList(intArray).iterator();

    while(mapKeyIterator.hasNext()) { //If the array and map are the same size then you only need to check for one.  Otherwise you'll need to validate both iterators have a next
        Object keyFromMap = mapKeyIterator.next();
        Object valueFromMap = objectMap.get(keyFromMap);
        Integer intFromArray = integerIterator.next();
        //Whatever you want to do
   }
}

如果您知道它们的长度相同,那么您也可以使用for(int i ...循环遍历数组,如果您不想创建List,只需使用地图的迭代器。

答案 2 :(得分:0)

这似乎是一个非常容易出错的API,要求完全断开连接的地图和数组。不仅容易出错,而且代码的读者很难分辨哪个int与哪个map条目相关。我总是建议不要使用这种API。试试Map&lt; Object,MySpecialType&gt;其中MySpecialType聚合了Object和int。