0

我在构造函数中创建一个 for 循环以同时迭代地图和数组时遇到了一些麻烦。在这里,表明这不能通过增强的 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]);
        }       
    }

感谢您对如何进行的任何想法。

4

3 回答 3

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像原来的例子那样在一个循环中组合两个迭代器。

于 2009-11-14T03:37:55.630 回答
0

看起来您尝试将模块Map作为 a传递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 ...循环遍历数组,如果您不想创建列表,则只需为映射使用迭代器。

于 2009-11-14T03:38:22.273 回答
0

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

于 2009-11-18T08:21:44.427 回答