Как сохранить порядок вставки - PullRequest
27 голосов
/ 04 июня 2010

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

Как я добавлю 1 в качестве ключа «один» в качестве значения, 2 в качестве ключа и «два» в качестве значения.

Вывод должен быть:

1:one
2:two

Ответы [ 3 ]

60 голосов
/ 04 июня 2010

Вот характерные отличия некоторых важных Map реализаций:

  • LinkedHashMap: "с предсказуемым порядком итерации [...], который обычно является порядком, в котором ключи были вставлены в карту ( порядок вставки )."
  • HashMap: «не дает никаких гарантий относительно порядка карты»
  • TreeMap: "сортируется в соответствии с естественным порядком ключей или по Comparator"

Похоже, LinkedHashMap - это то, что вам нужно в этом случае.

Вот фрагмент для иллюстрации различий; он также показывает общий способ итерации по всем элементам Map и то, как использование интерфейса для ссылки на объекты обеспечивает большую гибкость выбора реализации.

import java.util.*;
public class MapExample {
    public static void main(String[] args) {
        populateThenDump(new HashMap<String,Integer>());
        populateThenDump(new TreeMap<String,Integer>());
        populateThenDump(new LinkedHashMap<String,Integer>());
    }
    static void populateThenDump(Map<String,Integer> map) {
        System.out.println(map.getClass().getName());

        map.put("Zero",  0);
        map.put("One",   1);
        map.put("Two",   2);
        map.put("Three", 3);
        map.put("Four",  4);

        for (Map.Entry<String,Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " => " + entry.getValue());
        }
    }
}

Вывод приведенного выше фрагмента (, как видно на ideone.com ):

java.util.HashMap          // unordered, results may vary
Three => 3
Zero => 0
One => 1
Four => 4
Two => 2
java.util.TreeMap          // ordered by String keys lexicographically
Four => 4
One => 1
Three => 3
Two => 2
Zero => 0
java.util.LinkedHashMap    // insertion order
Zero => 0
One => 1
Two => 2
Three => 3
Four => 4

Похожие вопросы

Похожие вопросы

11 голосов
/ 04 июня 2010

Для хеш-таблицы используйте LinkedHashMap класс.

2 голосов
/ 04 июня 2010

Вы ищете класс LinkedHashMap.

...