123 votes

Comment trier un HashMap en Java

Comment pouvons-nous trier un HashMap<key, ArrayList> ?

Je veux trier sur la base d'une valeur dans le champ ArrayList .

146voto

pgras Points 7202

Devez-vous utiliser un HashMap ? Si vous n'avez besoin que de l'interface Map, utilisez un TreeMap


Si vous voulez trier en comparant les valeurs dans le HashMap. Vous devez écrire du code pour faire cela, si vous voulez le faire une fois, vous pouvez trier les valeurs de votre HashMap :

Map<String, Person> people = new HashMap<>();
Person jim = new Person("Jim", 25);
Person scott = new Person("Scott", 28);
Person anna = new Person("Anna", 23);

people.put(jim.getName(), jim);
people.put(scott.getName(), scott);
people.put(anna.getName(), anna);

// not yet sorted
List<Person> peopleByAge = new ArrayList<>(people.values());

Collections.sort(peopleByAge, Comparator.comparing(Person::getAge));

for (Person p : peopleByAge) {
    System.out.println(p.getName() + "\t" + p.getAge());
}

Si vous voulez accéder souvent à cette liste triée, vous pourriez insérer vos éléments dans un fichier de type HashMap<TreeSet<Person>> bien que la sémantique des ensembles et des listes soit un peu différente.

39voto

GkhnSr Points 653

Liste triée par clés hasmap :

SortedSet<String> keys = new TreeSet<String>(myHashMap.keySet());

Liste triée par valeurs hashmap :

SortedSet<String> values = new TreeSet<String>(myHashMap.values());

En cas de duplication des valeurs de la carte :

List<String> mapValues = new ArrayList<String>(myHashMap.values());
Collections.sort(mapValues);

Bonne chance !

23voto

http://snipplr.com/view/2789/sorting-map-keys-by-comparing-its-values/

obtenir les clés

List keys = new ArrayList(yourMap.keySet());

Les trier

 Collections.sort(keys)

les imprimer.

Dans tous les cas, vous ne pouvez pas avoir de valeurs triées dans HashMap (selon l'API This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time ].

Bien que vous puissiez pousser toutes ces valeurs vers LinkedHashMap pour une utilisation ultérieure.

13voto

JH. Points 1048

On dirait que vous voulez un treemap.

http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

Vous pouvez lui passer un comparateur personnalisé si cela s'applique.

11voto

Vitalii Fedorenko Points 17469

En Java 8 :

Comparator<Entry<String, Item>> valueComparator = 
    (e1, e2) -> e1.getValue().getField().compareTo(e2.getValue().getField());

Map<String, Item> sortedMap = 
    unsortedMap.entrySet().stream().
    sorted(valueComparator).
    collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                             (e1, e2) -> e1, LinkedHashMap::new));

Utilisation de Goyave :

Map<String, Item> map = ...;
Function<Item, Integer> getField = new Function<Item, Integer>() {
    public Integer apply(Item item) {
        return item.getField(); // the field to sort on
    }
};
comparatorFunction = Functions.compose(getField, Functions.forMap(map));
comparator = Ordering.natural().onResultOf(comparatorFunction);
Map<String, Item> sortedMap = ImmutableSortedMap.copyOf(map, comparator);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X