Итерация Java по набору ключей
У меня есть следующий код 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
вычисляется только один раз.
Есть комментарии? Спасибо.
Ответы
Ответ 1
Вместо повторения по 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) {
// ...
}
Ответ 2
вы получаете все ключи, а затем вы ищите каждый ключ в коллекции
Итерация 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 + ")" );
}
Ответ 3
Это может помочь вам:
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
Возможно, вы запрашиваете карту дважды:
- сначала для ключей,
- и второй для значений
Использование итератора набора записей будет выполнять итерацию по карте один раз.
Ответ 5
Доступ к HashMap с помощью итератора keySet выполняется даже быстрее, чем использование итератора keySet на TreeMap.
Ответ 6
Эй, Луиш,
Причина, по которой используется итератор keysey, менее эффективна, чем итерация entryset, заключается в том, что при первом варианте вам все равно придется использовать образы Map.get(key), которых избегают со второй опцией.
Ответ 7
Пример кода:
for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
System.out.println(i.getValue() + " " + i.getKey()));
}