J'ai map Map<Type, Long> countByType
et je veux avoir une liste qui a trié les clés (min à max) par leurs valeurs correspondantes. Mon essai est:
countByType.entrySet().stream().sorted().collect(Collectors.toList());
cependant, cela me donne juste une liste d'entrées, comment puis-je obtenir une liste de types sans perdre la commande?
Vous dites que vous voulez trier par valeur, mais vous ne l'avez pas dans votre code. Passez un lambda (ou une référence de méthode) à sorted
pour lui indiquer comment vous souhaitez trier.
Et vous voulez obtenir les clés; utilisez map
pour transformer les entrées en clés.
List<Type> types = countByType.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getValue))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
Vous devez trier avec un comparateur personnalisé en fonction de la valeur de l'entrée. Ensuite, sélectionnez toutes les clés avant de collecter
countByType.entrySet()
.stream()
.sorted((e1, e2) -> e1.getValue().compareTo(e2.getValue())) // custom Comparator
.map(e -> e.getKey())
.collect(Collectors.toList());
Vous pouvez trier une carte par valeur comme ci-dessous, plus d’exemple ici
//Sort a Map by their Value.
Map<Integer, String> random = new HashMap<Integer, String>();
random.put(1,"z");
random.put(6,"k");
random.put(5,"a");
random.put(3,"f");
random.put(9,"c");
Map<Integer, String> sortedMap =
random.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(e1, e2) -> e2, LinkedHashMap::new));
System.out.println("Sorted Map: " + Arrays.toString(sortedMap.entrySet().toArray()));
Map<Integer, String> map = new HashMap<>();
map.put(1, "B");
map.put(2, "C");
map.put(3, "D");
map.put(4, "A");
List<String> list = map.values().stream()
.sorted()
.collect(Collectors.toList());
Sortie: [A, B, C, D]
Vous pouvez utiliser ceci comme exemple de votre problème
Map<Integer, String> map = new HashMap<>();
map.put(10, "Apple");
map.put(20, "orange");
map.put(30, "banana");
map.put(40, "watermelon");
map.put(50, "dragonfruit");
// split a map into 2 List
List<Integer> resultSortedKey = new ArrayList<>();
List<String> resultValues = map.entrySet().stream()
//sort a Map by key and stored in resultSortedKey
.sorted(Map.Entry.<Integer, String>comparingByKey().reversed())
.peek(e -> resultSortedKey.add(e.getKey()))
.map(x -> x.getValue())
// filter banana and return it to resultValues
.filter(x -> !"banana".equalsIgnoreCase(x))
.collect(Collectors.toList());
resultSortedKey.forEach(System.out::println);
resultValues.forEach(System.out::println);
Voici la solution simple avec StreamEx
EntryStream.of(countByType).sortedBy(e -> e.getValue()).keys().toList();