перебирая карту и массив одновременно в цикле for - PullRequest
0 голосов
/ 14 ноября 2009

У меня возникли проблемы с созданием цикла 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]);
        }       
    }

Спасибо за любые идеи о том, как поступить.

Ответы [ 3 ]

2 голосов
/ 14 ноября 2009

Наивный способ сделать это - просто отследить 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, как в оригинальном примере.

0 голосов
/ 18 ноября 2009

Это похоже на очень подверженный ошибкам API, запрашивающий полностью отключенную карту и массив. Не только подвержен ошибкам, но и читателям кода будет сложно определить, какой int идет с какой записью карты. Я всегда советую против такого рода API. Попробуйте карту , где MySpecialType агрегирует как Object, так и int.

0 голосов
/ 14 ноября 2009

Похоже, вы пытаетесь передать модули 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 ... и просто использовать итератор для карты, если вы не хотите создавать список.

...