Tri d'une HashMap par valeurs
Problème :
Comment une HashMap peut-elle être triée en fonction des valeurs stockées dedans, garantissant que les clés sont automatiquement triées par ordre bien ?
Solution :
Méthode générique (pré-Java 8) :
Implémenter une méthode générique pour trier un map :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | private static <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sort(
final Map<K, V> unsorted,
final boolean order) {
final var list = new LinkedList<>(unsorted.entrySet());
list.sort((o1, o2) -> order
? o1.getValue().compareTo(o2.getValue()) == 0
? o1.getKey().compareTo(o2.getKey())
: o1.getValue().compareTo(o2.getValue())
: o2.getValue().compareTo(o1.getValue()) == 0
? o2.getKey().compareTo(o1.getKey())
: o2.getValue().compareTo(o1.getValue()));
return list.stream().collect(
Collectors.toMap(
Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap:: new
)
);
}
|
Copier après la connexion
Utilisation avec Ascendant et Descendant Commande :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.util.HashMap;
import java.util.Map;
public class SortMapByValue {
public static final boolean ASC = true;
public static final boolean DESC = false;
public static void main(String[] args) {
Map<String, Integer> unsortMap = new HashMap<>();
unsortMap.put( "B" , 55);
unsortMap.put( "A" , 80);
unsortMap.put( "D" , 20);
unsortMap.put( "C" , 70);
Map<String, Integer> sortedMapAsc = sort(unsortMap, ASC);
Map<String, Integer> sortedMapDesc = sort(unsortMap, DESC);
}
}
|
Copier après la connexion
Fonctionnalités Java 8 et supérieures plus récentes :
Alternativement, une solution plus concise utilisant des expressions lambda Java 8 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;
public class SortMapByValue {
...
private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap, final boolean order) {
List<Entry<String, Integer>> list = new LinkedList<>(unsortMap.entrySet());
list.sort((o1, o2) -> order ? o1.getValue().compareTo(o2.getValue()) == 0
? o1.getKey().compareTo(o2.getKey())
: o1.getValue().compareTo(o2.getValue()) : o2.getValue().compareTo(o1.getValue()) == 0
? o2.getKey().compareTo(o1.getKey())
: o2.getValue().compareTo(o1.getValue()));
return list.stream().collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap:: new ));
}
...
}
|
Copier après la connexion
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!