我有一个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
答案 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());
请注意,此方法排序两次。您可以捕获一次条目,然后从该临时列表中进行投影,如下所示:
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());
答案 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