将地图拆分为两个列表

时间:2016-04-06 13:21:56

标签: java list dictionary

我有一个Map<String,Integer>,它的值按如下方式排序:

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

但是我怎么能得到一个String列表,它将被排序等于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

4 个答案:

答案 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

答案 1 :(得分:2)

您已经拥有地图List的{​​{1}}(由变量list引用),按您所描述的顺序按值排序。您可以从这些对象构造新的,单独的Entry个键和值。非流版本可能是:

List

答案 2 :(得分: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());

答案 3 :(得分:0)

你可以使用一个TreeMap和一个比较值而不是键的比较器,然后只需要调用keys()和values()。

请参阅:https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html