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

Java 在for循环中同时迭代map和array,java,collections,for-loop,variadic-functions,foreach,Java,Collections,For Loop,Variadic Functions,Foreach,在构造函数中创建for循环以同时迭代映射和数组时遇到一些问题,有人指出,这不能用增强的for循环来完成 我有类似的东西,这会引发编译器错误。基本上,这个类有一个映射,我想通过构造函数填充它,构造函数将集合和可变数量的整数作为参数 var arg表达式的计算结果是一个整数数组,因此我尝试将两个增强的迭代器放在同一个循环中,但没有成功 private final Map<Module, Integer> modules = new HashMap<Module, Integer&g

在构造函数中创建for循环以同时迭代映射和数组时遇到一些问题,有人指出,这不能用增强的for循环来完成

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

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]);
        }       
    }
private final Map modules=new HashMap();
AssemblyType(收集模块、整数…单位){
int i=0;
用于(模块:模块,整数i:单位){
这个.modules.put(module,units[i]);
}       
}

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

最简单的方法就是跟踪
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
循环中。

看起来您试图将模块
映射作为
集合传递,这将导致编译错误

对这两个对象进行迭代的代码可能是这样的

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
   }
}
publicMyMethod(映射对象映射,整数…数组){
if(intArray.length!=ObjectMap.size()){
//你想怎么处理这个案子
}
迭代器mapKeyIterator=objectMap.keySet().Iterator();
迭代器integerIterator=Arrays.asList(intArray.Iterator();
while(mapKeyIterator.hasNext()){//如果数组和映射大小相同,则只需检查其中一个。否则,需要验证两个迭代器是否都有下一个
Object keyFromMap=mapKeyIterator.next();
objectvaluefrommap=objectMap.get(keyFromMap);
整数intFromArray=integerIterator.next();
//你想干什么都行
}
}

如果知道它们的长度相同,那么还可以使用
遍历数组(int i…
循环,如果不想创建列表,只需对映射使用迭代器即可。

这似乎是一个非常容易出错的API,用于要求完全断开连接的映射和数组。不仅容易出错,而且代码读者很难分辨哪个int与哪个映射条目相匹配。我始终建议不要这样做API的索引。尝试一个映射,其中MySpecialType聚合了一个对象和一个int。

运算符在for循环中工作吗?最简单的方法通常是最好的。在这种情况下,它也可以工作,因为var args与集合的长度相同!谢谢,这可能有点危险。您介意给出一个简短的示例,说明您使用的方法吗再次暗示当问题用如此模糊的术语表述时,这是很难的;如果你能把它说得更具体一些,这会有所帮助。(注:我的回答现在稍微容易理解,因为我回到了前面,正确地避开了尖括号——呵呵。)