我想通过附加到每个键的特定等级对HashMap进行分组。键可以为1或2。因此,最后,应映射并输入给定的输入哈希图(如<String, Integer>),格式为<Integer, Set<String>>-输出图的键为等级,值为原始输入映射中属于该等级的所有字符串的集合。如果输出映射中的Set按原始映射中的值的降序排序,那也很好。

这是我最初的工作方式和工作方式,但是我想使用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())));

关于java - 使用Java 8 toMap函数将HashMap排序到存储桶中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36924145/

10-11 07:51