127 Stimmen

Wie man eine HashMap in Java sortiert

Wie können wir eine HashMap<key, ArrayList> ?

Ich möchte auf der Grundlage eines Wertes im Feld ArrayList .

149voto

pgras Punkte 12434

Müssen Sie eine HashMap verwenden? Wenn Sie nur die Map-Schnittstelle benötigen, verwenden Sie eine TreeMap


Wenn Sie durch den Vergleich von Werten in der HashMap sortieren möchten. Sie müssen Code schreiben, um dies zu tun, wenn Sie es einmal tun wollen, können Sie die Werte Ihrer HashMap sortieren:

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());
}

Wenn Sie häufig auf diese sortierte Liste zugreifen wollen, können Sie Ihre Elemente in eine HashMap<TreeSet<Person>> Die Semantik von Mengen und Listen ist jedoch etwas anders.

40voto

gokhansari Punkte 2299

Sortierte Liste nach Hasmap-Schlüsseln:

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

Sortierte Liste nach Hashmap-Werten:

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

Im Falle von doppelten Kartenwerten:

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

Viel Glück!

25voto

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

die Schlüssel bekommen

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

Sortieren

 Collections.sort(keys)

drucken sie.

In jedem Fall können Sie keine sortierten Werte in der HashMap haben (gemäß der 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 ].

Sie können zwar alle diese Werte auf LinkedHashMap auch zur späteren Verwendung.

13voto

JH. Punkte 3937

Es scheint, als ob Sie eine Baumstruktur benötigen.

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

Sie können ihm einen benutzerdefinierten Komparator übergeben, wenn das zutrifft.

12voto

Vitalii Fedorenko Punkte 103468

In 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));

Verwendung von Guave :

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);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X