две итерации HashMap - PullRequest
       1

две итерации HashMap

4 голосов
/ 26 декабря 2010

У меня есть два HashMaps, и я могу перебрать оба хеш-карты с помощью следующего кода

Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry)it.next();
    String firstVal = pairs.getValue();
}

Iterator it2 = mp2.entrySet().iterator();
while (it2.hasNext()) {
    Map.Entry pairs2 = (Map.Entry)it.next();
    String SecondVal = pairs2.getValue();
}

myFunction(firstVal, SecondVal)

Есть ли способ повторять два хеш-карты одновременно без использования двух циклов?

В настоящее время у меня есть метод, который принимает два параметра, и каждое значение параметра сохраняется в первом и втором хэш-картах. Я должен повторить первый хэш, а затем второй, чтобы получить значения. Я думаю, что должен быть хороший способ сделать это, но я не знаю: (

P.S .: в приведенном выше коде могут быть некоторые ошибки, так как это всего лишь пример, объясняющий мою проблему. Каждый итератор является методом в исходной программе и принимает один параметр. Я не мог скопировать прошлые функции реального времени, поскольку они ОГРОМНЫ!

Ответы [ 6 ]

3 голосов
/ 26 декабря 2010

Положите значения 2 карт в список, затем зациклите список:

//Merge 2 values of maps to a list
List<String> mergedList = new ArrayList<String>();
mergedList.addAll(map1.values());
mergedList.addAll(map2.values());

int size = map1.size() < map2.size() ? map1.size() : map2.size();
for(int i=0; i < size; i++){
    myFunction(mergedList.get(i), mergedList.get(map1.size() + i));
}
2 голосов
/ 26 декабря 2010

ваш код выглядит хорошо.Просто используйте цикл while как внутренний и внешний цикл, чтобы выполнить итерацию на обоих HashMaps.Во втором цикле while вы можете вызывать свою функцию для выполнения чего угодно.

while loop (iterate first hashmap)
    second while loop(iterate second hashmap)
         call your function here and pass values
1 голос
/ 26 декабря 2010

Я думаю, что вы пытаетесь сделать следующее:

if (mp.size() != mp2.size()) {
    throw SomeException("mismatched parameters");
}
Iterator it = mp.entrySet().iterator();
Iterator it2 = mp2.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry)it.next();
    String firstVal = pairs.getValue();
    Map.Entry pairs2 = (Map.Entry)it.next();
    String secondVal = pairs2.getValue();
    myFunction(firstVal, secondVal);
}

Обратите внимание, что параллельная итерация над записями в паре HashMaps является хитрой.Случай only , в котором записи HashMaps будут «выстраиваться» по ключам, - это если два HashMaps имеют идентичные ключи с одинаковыми хеш-кодами, и они были заполнены в том же порядке, начиная с недавно выделенных HashMaps.

Поэтому я думаю, что вам действительно нужно сделать что-то подобное.

if (mp.size() != mp2.size()) {
    throw SomeException("mismatched parameters");
}
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry)it.next();
    String firstVal = pairs.getValue();
    String SecondVal = mp2.get(pairs.getKey());
    myFunction(firstVal, SecondVal);
}
1 голос
/ 26 декабря 2010
    Map.Entry pairs;
    String firstValue = null;
String secondValue = null;
    while(it.hasNext() || it2.hasNext()){
     if (it.hasNext()){
      pairs = (Map.Entry)it.next();
      firstValue = pairs.getValue();
     }
     if (it2.hasNext(){
      pairs = (Map.Entry)it2.next();
      secondValue = pairs.getValue();
     }
     if (firstValue != null && secondValue != null){
       yourMethodHere();
       firstValue = null;
       secondValue = null;
     }
    }
0 голосов
/ 23 сентября 2013

Если объекты Map являются параллельными, то, возможно, лучшим решением будет создание пользовательского класса вместо использования Map. Можно гарантировать порядок итераций в Картах, как уже упоминалось в некоторых используемых объектах (другой - LinkedHashMap). Это не дает разработчику лицензию на использование объектов, как если бы они были массивами или списками.

0 голосов
/ 26 декабря 2010

Вы не можете повторить две карты в одном цикле, если они не имеют одинаковый набор ключей.Я не знаю, как вы находите firstVal и SecondVal, это кажется немного двусмысленным.Может быть, вы могли бы получить эти два значения на Map.get()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...