我在构造函数中创建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]);
}
}
感谢有关如何继续的任何想法。
答案 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。