Arraylisten nach Größe sortieren?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Die Einträge einer HashMap sind nicht geordnet.

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.

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/HashMap.html

Wenn du eine HashMap mit geordneten Einträgen willst solltest du eine TreeMap verwenden.

Versuch's mal mit folgender, die sollte alle Einträge automatisch anhand der Länge des Arrays sortieren:

TreeMap<String, ArrayList<Item>> treeMap = new TreeMap<>(Comparator.comparingInt(name -> treeMap.get(name).size()).reversed());
Woher ich das weiß:eigene Erfahrung – Minecraft-Experte. Aktiver Spieler seit 2011.

HammiTommi 
Fragesteller
 18.06.2023, 20:32

Hallo, bei mir kommt jetzt immer der Fehler: Cannot invoke "java.util.ArrayList.size()" because the return value of "java.util.TreeMap.get(Object)" is null.

Das ist der Code:

TreeMap<String, ArrayList<Integer>> player_list;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    


        player_list = new TreeMap<>(Comparator.comparingInt(name -> player_list.get(name).size()).reversed());

for (Object string : player_list.keySet().toArray()) {
    sender.sendMessage((String) string);
}
0
MrAmazing2  18.06.2023, 20:56
@HammiTommi

Ah ok, my bad, man kann eine TreeMap wohl nicht anhand ihrerer values sortieren, sondern nur anhand der Keys.

Wenn du das eh nur sortieren willst, um eine Liste an Keys in der richtigen Reihenfolge zu erhalten, kannst du deine HashMap hernehmen wie du es bisher hattest und darauf basierend eine Liste an Keys erstellen. So in der Art müsste es gehen:

List<String> strings = player_list.entrySet().stream()
        .sorted(Comparator.comparing(entry -> entry.getValue().size()))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
0