java 如何将流收集到TreeMap中

uinbv5nw  于 2023-02-02  发布在  Java
关注(0)|答案(3)|浏览(295)

我知道这是一个菜鸟问题,但我不能找到一个简单的答案在其他地方。问题是:我需要写一个返回SortedMap的方法,这样树Map就可以工作了。我有一个HashMap< String, Skill>Skill类有getNamegetNumApplicants两个方法,我需要返回一个SortedMap<String, Long>,技能的名称作为键,申请者的数量作为值。这就是我的立场:

private Map<String,Skill> skillMap = new HashMap<>();

public SortedMap<String, Long> skill_nApplicants() {

    return skillMap.values().stream().collect(...);
}

这是技能类

public class Skill {

    private String name;
    private List <Position> reqPosition = new ArrayList<>();
    private Long numApplicants;

    public void plusOneApplicant() {
        this.numApplicants++;
    }

    public Long getNumApplicants() {
        return numApplicants;
    }
    public Skill(String name) {
        super();
        this.name = name;
        this.numApplicants = 0L;
    }
    public String getName() {
        return name;
        }

    public List<Position> getPositions() {
        return reqPosition;
        }
    public void addReqPosition(Position p) {
        this.reqPosition.add(p);
        return;
    }
}

我知道这应该很容易,我只是有一个非常困难的时间在理解这一切的事情。

pw136qt2

pw136qt21#

不要先将数据收集到HashMap,* 然后 * 转换为TreeMap。使用重载的toMap(keyMapper, valueMapper, mergeFunction, mapSupplier)方法直接将数据收集到TreeMap,该方法允许您指定要创建哪个Map(第4个参数)。

public SortedMap<String, Long> skill_nApplicants() {
    return skillMap.values().stream().collect(Collectors.toMap(
            Skill::getName,
            Skill::getNumApplicants,
            Math::addExact, // only called if duplicate names can occur
            TreeMap::new
    ));
}
nue99wik

nue99wik2#

这就是你能做到的

public SortedMap<String, Long> skill_nApplicants(Map<String, Skill> skillMap) {
    Map<String, Long> result = skillMap.values().stream().collect(Collectors.toMap(Skill::getName, Skill::getNumApplicants));
    return new TreeMap<>(result);
}
2izufjch

2izufjch3#

如果在你的流中,你没有两个(或更多)值应该被Map到同一个键,那么你可以完全避免使用收集器(这样你就不需要考虑合并函数)。
您只需使用forEach将每个技能添加到Map中即可:

public SortedMap<String, Long> skill_nApplicants() {
    Map<String, Long> result = new TreeMap<>();
    
    skillMap.values()
        .forEach((skill) -> result.put(skill.getName(), skill.getNumApplicants());
        
    return result;
}

如果希望返回不可修改的Map,可以用Collections.unmodifiableSortedMap Package result

相关问题