2011-01-22 5 views
0

Мне нужно пропустить HashMap, но придать значение порядку значений. Например, рассмотрим следующий хэш-карту <String, Integer>:Итерация через HashMap значениями

{"dog" : 2, "bird": 3, "cat" : 1} 

Теперь мне нужно перебрать карте дужки в порядке значений восходящих, так что

for() { 
System.out.println(currentKey); 
} 

всегда будет выход

«кошка», «собака», «птица»

+2

В вашем вопросе ваши ключи и значения одинаково сортируются одинаково, поэтому легко понять непонятый вами вопрос. Если бы карта была '{" r ": 2," q ": 3," z ": 1}', вы бы хотели, чтобы 'z r q' (порядок в соответствии со значениями 1, 2, 3) или' q r z'? Вы сказали «порядок значений», и поэтому я предполагаю, что вы хотите 'z r q' (порядок в соответствии со значениями 1, 2, 3), но ... Также могут быть повторяющиеся значения? Например, '{" r ": 2," q ": 3," z ": 1," w ": 1}' (есть две записи со значением '1'). Если да, то в каком порядке вы их хотите? По ключевому слову? Неопределенный? –

+0

Исправлено, спасибо – Joel

+0

Вы исправили первую часть, а не вторую: * «Также могут быть повторяющиеся значения? Например,' {"r": 2, "q": 3, "z": 1, "w ": 1}' (есть две записи со значением '1'). Если да, то в каком порядке вы их хотите? Ключом? Неопределенный?" * –

ответ

1

Если вы хотите иметь саму карту сортировать по значению, как вы вставите записи, то самый простой способ, вероятно, будет использовать что-то вроде TreeMultimap в библиотеке коллекции от Google ,

Если вы все еще хотите использовать хэш-карту, но имеете значения, отсортированные, когда вы извлекаете их из набора, вы можете использовать два подхода: либо вы можете получить значения с помощью метода values ​​(), а затем запустить Collections.sort() в возвращаемом списке, или вы можете снова использовать класс, например TreeMultimap, добавив все записи в текущую хэш-карту и затем перечислив их.

4

Возможно, вас может заинтересовать, используя TreeMap, который сортирует ваши записи по ключевым словам.

В противном случае вам может быть интересно изучить Map.keySet(), Map.entrySet(), или Map.values().

Если вы все еще хотите сохранить свою карту HashMap, вы можете использовать одну из Collections 'многочисленных функций для получения отсортированных коллекций (например, вы можете получить отсортированную версию своей карты, отсортировать список и т. Д.).


Поскольку я вижу, что вы конкретно хотите отсортировать по значениям, я думаю, Michał Minicki «s ответ должен быть то, что вы хотите.

1

Другой пример использования Guava:

Плюсы:

  • возвращает записи (а не только ключи)
  • Не требует ключи быть Comparable

static <K, V>Set<Map.Entry<V, K>> 
entriesByValue(Map<K, V> source, Comparator<V> cmp) { 
    SortedMap<V, Collection<K>> inverseMap = Maps.newTreeMap(cmp); 
    Supplier<Set<K>> setFactory = new Supplier<Set<K>>() { 
     public Set<K> get() { 
      return Sets.newHashSet(); 
     } 
    }; 
    SetMultimap<V, K> inverseMM = 
     Multimaps.newSetMultimap(inverseMap, setFactory); 
    Multimaps.invertFrom(Multimaps.forMap(source), inverseMM); 
    return Collections.unmodifiableSet(inverseMM.entries()); 
} 
Смежные вопросы