Как перемещаться по Linked Hash Map в обратном направлении?

Возможный дубликат:
Итерация через LinkedHashMap в обратном порядке

Как перемещаться по Linked Hash Map в обратном порядке? Есть ли какой-либо предопределенный метод на карте?

Я создаю его следующим образом:

LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer,String>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

Ответы

Ответ 1

List<Entry<Integer,String>> list = new ArrayList<>(map.entries());

for( int i = list.size() -1; i >= 0 ; i --){
    Entry<Integer,String> entry = list.get(i);
}

Не очень красиво и за счет копии набора записей, которое, если ваша карта имеет значительное количество записей, может быть проблемой.

Превосходный библиотека Guava имеет [List.reverse(List<>)][2], который позволит вам использовать Java 5 для каждого цикла стиля, а не индексированный цикл:

//using guava
for( Entry entry : Lists.reverse(list) ){
    // much nicer
}

Ответ 2

Попробуйте это, он напечатает ключи в порядке обратного ввода:

ListIterator<Integer> iter =
    new ArrayList<>(map.keySet()).listIterator(map.size());

while (iter.hasPrevious()) {
    Integer key = iter.previous();
    System.out.println(key);
}

Вы также можете выполнить итерацию с помощью обратного порядка вставки записей:

ListIterator<Map.Entry<Integer, String>> iter =
    new ArrayList<>(map.entrySet()).listIterator(map.size());

while (iter.hasPrevious()) {
    Map.Entry<Integer, String> entry = iter.previous();
    System.out.println(entry.getKey() + ":" + entry.getValue());
}

Ответ 3

Guava ПРАВИЛА:

List<Object> reverseList = Lists.reverse(
        Lists.newArrayList(map.keySet()));

Lists.reverse