/ / Karte in zwei Listen aufteilen - Java, Liste, Wörterbuch

Karte in zwei Listen aufteilen - Java, Liste, Wörterbuch

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 № 1

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

Demo 1

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

Demo 2


2 für die Antwort № 2

Du hast schon eine List (referenziert durch Variable list) der Karte Entrys, sortiert nach Wert in der von Ihnen beschriebenen Reihenfolge. Sie können einfach nur neu konstruieren Lists 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