2016-04-06 3 views
4

У меня есть Map<String,Integer> и отсортирован по значению, как это:Split отображение в двух списках

set = map.entrySet(); 
list = new ArrayList<Map.Entry<String, Integer»(set); 
Collections.sort(list, (o1, o2) -> (o2.getValue()).compareTo(o1.getValue())); 

У меня уже есть отсортированный список целое с этой карты:

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

Но как я могу получить список строк, который будет отсортирован равным Map (по значению)?

Я имею в виду, если у меня есть карта с элементами:

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

и сортировать это нравится:

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

Мне нужно получить 2 списка:

eggs 
foo 
echo 
smt 

и

1500 
320 
150 
50 
+0

Будет 'word_list = новый ArrayList (map.keySet() .stream() .sorted() .collect (Collectors.toList()));' работа? – jr593

+0

Обратите внимание, что вводить в заблуждение, что «Карта» сортируется. Построение и сортировка «Список» записей «Карта» не влияет на порядок итераций этих представлений коллекции «Карта». У вас есть только отсортированный «Список», который, тем не менее, может быть полезен. –

ответ

3

Вы можете добавить проекцию ваших потоков с помощью map(), например:

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

Обратите внимание, что этот подход сортирует дважды. Вы можете захватить записи один раз, а затем проецировать из этого временного списка, например:

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

У вас уже есть List (ссылка на переменную list) на карту Entry s, отсортированную по значению в порядке, который вы описываете. Вы можете просто построить новые, отдельные ключи и значения этих объектов. Версия, не поток, который может быть:

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

Можно сортировать и перебирать только один раз с помощью этого метода:

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()); 
Смежные вопросы