Java итерация над набором ключей - PullRequest
13 голосов
/ 25 марта 2011

У меня есть следующий код Java:

public void myMethod (final Map pFeatureGroupsFromPackage) {

   final Set<String> keys = pFeatureGroupsFromPackage.keySet();

   for (final String key : keys) {
           tmpList = (List<FeatureKey>) pFeatureGroupsFromPackage.get(key);
    // do whatever
   }
}

Я получаю предупреждение от "findBugs", сообщающее следующее:

Метод myMethod неэффективно использует итератор keySet вместо итератора entrySet. Предупреждение делается при назначении tmpList.

Я не понимаю, почему это неэффективно. На самом деле список keys вычисляется только один раз. Любой комментарий? Спасибо.

Ответы [ 7 ]

25 голосов
/ 25 марта 2011

Вместо итерации по keySet и вызова get для получения соответствующего значения для каждого ключа, итерируйте по entrySet:

final Set<Map.Entry<String, List<FeatureKey>>> entries = pFeatureGroupsFromPackage.entrySet();

for (Map.Entry<String, List<FeatureKey>> entry : entries) {
    String key = entry.getKey();
    List<FeatureKey> tmpList = entry.getValue();

    // do whatever
}

Таким образом, вам не нужно искать на карте каждый ключ; вы сразу получаете ключ и значение за один раз.

Также объявите ваш Map с параметрами типа:

public void myMethod (final Map<String, List<FeatureKey>> pFeatureGroupsFromPackage) {
    // ...
}
4 голосов
/ 04 августа 2014

Это может помочь вам:

Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry entry = (Map.Entry) entries.next();
    Integer key = (Integer)entry.getKey();
    Integer value = (Integer)entry.getValue();
    System.out.println("Key = " + key + ", Value = " + value);
}
4 голосов
/ 25 марта 2011

вы получаете все ключи, а затем вы ищете каждый ключ в коллекции

итерация Map.EntrySet будет намного быстрее, небольшой пример:

Но вы также должны использовать дженерики ...

Set entries = map.entrySet();
      Iterator entryIter = entries.iterator();
      System.out.println("The map contains the following associations:");
      while (entryIter.hasNext()) {
         Map.Entry entry = (Map.Entry)entryIter.next();
         Object key = entry.getKey();  // Get the key from the entry.
         Object value = entry.getValue();  // Get the value.
         System.out.println( "   (" + key + "," + value + ")" );
      }
0 голосов
/ 07 апреля 2015

Пример кода:

for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
    System.out.println(i.getValue() + " " + i.getKey()));
}
0 голосов
/ 25 марта 2011

Привет, Luixv, Причина, по которой использование итератора keysey менее эффективна, чем итератора набора записей, заключается в том, что при использовании первой опции вам все равно придется использовать освобождение Map.get (key), чего не требуется при использовании второй опции.

0 голосов
/ 25 марта 2011

Доступ к HashMap через итератор keySet даже быстрее, чем при использовании итератора keySet в TreeMap.

0 голосов
/ 25 марта 2011

Возможно, вы запрашиваете карту дважды:

  • сначала для ключей,
  • , а затем для значений

Использование entrysetитератор будет перебирать карту один раз.

...