Эффективный способ вычитать значения в двух HashMaps по ключу - PullRequest
2 голосов
/ 26 апреля 2011

Мне интересно, как эффективно вычесть значения двух карт, когда их ключи совпадают. В настоящее время у меня есть 2 HashMap<String,Integer> и делаю это так:

for (String key: map1.keySet()){
   if (map2.keySet().contains(key)){
       //subtract
   }
}

Есть ли лучший способ сделать это?

Ответы [ 4 ]

5 голосов
/ 26 апреля 2011

Теоретически, это примерно так же быстро, как это может быть сделано, если вы не можете каким-то образом быстрее, чем O (n) найти подходящие ключи между двумя HashMap s.

  • Перебор ключей в первой карте keySet() - O (n)
    • Проверьте, находится ли ключ на другой карте - O (1)
    • Сделай свою операцию - O (1)
1 голос
/ 04 октября 2012

Поймите, что это старая тема, но проверьте гуаву из Google

https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Maps

Вы можете использовать Map.difference, а затем получить общие записи, только слева, справаи т.д.

0 голосов
/ 26 апреля 2011

Я думаю, что нет лучшего метода , если только вы не используете другой подход и / или другие структуры данных.Например, вы можете создать класс с именем ValuePair, который может содержать (до) двух значений, представляющих значения, которые вы храните в настоящее время на двух разных картах, но вместо этого вы сохраняете все пары на одной карте, и когда это происходитдля «вычитания» вы можете выполнить итерацию в одном наборе ключей.Обратите внимание, что пара может быть неполной, поэтому вычитание не выполняется.

Но это, вероятно, излишество.

0 голосов
/ 26 апреля 2011

рассматривали ли вы возможность использования коллекций Apache Commons?

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