2016-04-06 16 views
4

Ich habe eine Map<String,Integer> und es von Wert wie folgt sortiert ist:Split Karte in zwei Listen

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 Liste mit ganzen Zahlen von dieser Karte:

word_used = new ArrayList<Integer>(map.values() 
.stream() 
.sorted() 
.collect(Collectors.toList())); 
Collections.reverse(word_used); 

Aber wie kann ich eine String-Liste, die gleich Map (nach Wert) sortiert wird?

Ich meine, wenn ich eine Karte mit Hand haben:

map.put("eggs",1500); 
map.put("echo",150); 
map.put("foo",320); 
map.put("smt",50); 

und sortieren es mögen:

eggs : 1500 
foo : 320 
echo : 150 
smt : 50 

I 2 Listen erhalten müssen:

eggs 
foo 
echo 
smt 

und

1500 
320 
150 
50 
+0

Würde 'word_list = new Arraylist (map.keySet() .stream() .sorted() .collect (Collectors.toList()));' Arbeit? – jr593

+0

Beachten Sie, dass es irreführend ist zu sagen, dass die 'Map' sortiert ist. Das Konstruieren und Sortieren einer "Liste" der "Map" -Einträge hat keine Auswirkung auf die Iterationsreihenfolge der Auflistungsansichten dieser Map. Sie haben nur eine sortierte 'Liste' - die trotzdem nützlich sein kann. –

Antwort

3

Sie können Projektion auf Ihre Streams hinzufügen map() verwenden, wie folgt aus:

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. Sie können die Einträge erfassen einmal, und dann von dieser temporären Liste projizieren, wie folgt aus:

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

Sie haben bereits eine List (referenziert durch Variable list) der Karte Entry s, sortiert nach Wert in der Reihenfolge, die Sie beschreiben. Sie können einfach neue, separate List s der Schlüssel und Werte dieser Objekte erstellen. Die Nicht-Strom-Version das auch sein mag:

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

Sie können:

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