2014-11-29 3 views
1

Как создать итератор (путем реализации iterable) в Hashmap, если он не сохраняет порядок? Мои ключи следует заказывать .. и я хочу итерации по убываниюреализация итератора с истребителем к Hashmap - возможно ли это?

+0

Вы можете перебирать набор записей. – August

+1

'Iterator' сам ничего не говорит о порядке, он просто выполняет итерации над элементами коллекции. –

+0

См. Мои обновления PLS – Ohad

ответ

3

Используйте TreeMap может быть:

Карта сортируются в соответствии с естественным порядком его ключей

Кроме того, из TreeMap.keySet() документации:

возвращает набор вид ключей, содержащихся на этой карте. итераторы Сета возвращают ключи в порядке возрастания


Итерация пример:

TreeMap<K,V> tree; 
// ... 
for (final String key : tree.keySet()) { 
    final V value = tree.get(key); 
} 
+0

как это сделать, если у меня нет метода get (index)? – Ohad

+0

У вас есть ['get()'] (https://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html#get%28java.lang.Object%29) – outlyer

+0

получить ключи как Set? он заказал Set? – Ohad

1

Это правда, что HashMap не сохраняет порядок вставки. Но, вы можете использовать LinkedHashMap из которых Javadoc говорит (частично)

Хеш таблица и реализация связанного списка интерфейса Map с предсказуемым порядком итерации.

+0

да, но связанныйhasmap не имеет метода get (index) .. – Ohad

+0

@Shiran Correct (как 'HashMap') он имеет [' get (Object key) '] (http://docs.oracle.com/javase/ 7/документы/API/Java/Util/LinkedHashMap.html # прибудет% 28java.lang.Object% 29). В вашем вопросе говорилось 'HashMap', а не' List'. –

+0

, так что в основном это та же реализация связанного списка, просто используя get (ключ объекта)? – Ohad

0

Вы можете скопировать записи из HashMap в коллекцию, которая сохраняет порядок (как List) и затем сортируйте их на основе ключей (в обратном порядке). Вы говорите, что хотите сортировать ключи в порядке убывания, поэтому я предполагаю, что ключ реализует Comparable, но поскольку я не знаю, какой тип вашего ключа, я использовал параметры типа K и V в качестве заполнителей.

Map<K, V> map = new HashMap<>(); 
    List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet()); 
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() { 
     @Override 
     public int compare(Entry<K, V> o1, Entry<K, V> o2) { 
      Comparable k1 = (Comparable) o1.getKey(); 
      Comparable k2 = (Comparable) o2.getKey(); 
      return -k1.compareTo(k2); 
     } 
    });