ich habe ein Map<String,Integer>
und es wird nach dem folgenden Wert sortiert:
set = map.entrySet();
list = new ArrayList<Map.Entry<String, Integer»(set);
Collections.sort( list, (o1, o2) -> (o2.getValue()).compareTo( o1.getValue() ));
Ich habe bereits eine sortierte Integer-Liste von dieser Karte:
word_used = new ArrayList<Integer>(map.values()
.stream()
.sorted()
.collect(Collectors.toList()));
Collections.reverse(word_used);
Aber wie bekomme ich eine Stringliste, die nach Map (nach Wert) sortiert wird?
Ich meine, wenn ich eine Karte mit Gegenständen habe:
map.put("eggs",1500);
map.put("echo",150);
map.put("foo",320);
map.put("smt",50);
und sortiere es wie:
eggs : 1500
foo : 320
echo : 150
smt : 50
Ich brauche 2 Listen:
eggs
foo
echo
smt
und
1500
320
150
50
Antworten:
3 für die Antwort № 1Sie können Ihren Streams eine Projektion hinzufügen map()
, so was:
List<String> word_used = map.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry<String,Integer>::getValue).reversed())
.map(Map.Entry<String,Integer>::getKey)
.collect(Collectors.toList());
List<Integer> ints_used = map.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry<String,Integer>::getValue).reversed())
.map(Map.Entry<String,Integer>::getValue)
.collect(Collectors.toList());
Beachten Sie, dass dieser Ansatz zweimal sortiert wird. Sie können die Einträge einmal erfassen und dann wie folgt aus dieser temporären Liste projizieren:
List<Map.Entry<String,Integer>> sortedList = map
.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry<String,Integer>::getValue).reversed())
.collect(Collectors.toList());
List<String> word_used = sortedList
.stream()
.map(Map.Entry<String,Integer>::getKey)
.collect(Collectors.toList());
List<Integer> ints_used = sortedList
.stream()
.map(Map.Entry<String,Integer>::getValue)
.collect(Collectors.toList());
2 für die Antwort № 2
Du hast schon eine List
(referenziert durch Variable list
) der Karte Entry
s, sortiert nach Wert in der von Ihnen beschriebenen Reihenfolge. Sie können einfach nur neu konstruieren List
s der Schlüssel und Werte dieser Objekte. Die Nicht-Stream-Version davon könnte sein:
List<String> words = new ArrayList<>();
List<Integer> values = new ArrayList<>();
for (Map.Entry<String, Integer> entry : list) {
words.add(entry.getKey());
values.add(entry.getValue());
}
0 für die Antwort № 3
Man kann mit dieser Methode nur einmal sortieren und iterieren:
List<String> word_used = new ArrayList<String>();
List<Integer> ints_used = map.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry<String,Integer>::getValue).reversed())
.peek(e -> word_used.add(e.getKey()))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
0 für die Antwort № 4
Sie können eine TreeMap mit einem Komparator verwenden, der Werte anstelle von Schlüsseln vergleicht und dann einfach keys () und values () aufruft.
Sehen: https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html