我想按附加到每个键的特定等级对HashMap进行分组。键可以是等级 1 或 2。因此,最后,像<String, Integer>
这样的给定输入哈希映射应该以这种形式映射和输出 <Integer, Set<String>>
- 其中输出映射的键是秩,值是原始输入映射中属于该秩的所有字符串的集合。如果输出映射中的集合按原始映射中的值降序排序,那也很好。
这是我最初的做法,它的工作原理,但我想使用 toMap 函数,感觉这种方法有点矫枉过正。
private Set<String> sortByValue(Map<String, Long> iMap) {
//This is where we are going to bucket our stuff
Map<Integer, Set<String>> rankSort = new HashMap<Integer, Set<String>>() {{
put(1, new LinkedHashSet<>());
put(2, new LinkedHashSet<>());
}};
//Just populating rankSort with elements from the map
iMap.entrySet().stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.forEachOrdered(e -> rankSort.get(isRank1(e.getKey()) ? 1 : 2).add(e.getKey()));
return new LinkedHashSet<String>() {{
addAll(rankSort.get(2));
addAll(rankSort.get(1));
}};
}
private boolean isRank1(String val) {
try {
return extService.getIt(val).getParent() == null;
} catch (Exception ex) {
return false;
}
}
你要找的不是toMap
而是
iMap.entrySet().stream()
.collect(groupingBy(
Entry::getValue,
mapping(Entry::getKey, toSet())));