1

我目前在弄清楚如何使用 Java 8 流时遇到了麻烦。我正在尝试从lista_dottori( Map<Integer, Doctor>) 转到一个新地图patientsPerSp,其中每个医学专业(方法getSpecialization)我映射了拥有该专业医生的患者数量(getPatients类中的方法Doctor返回List该医生的患者)。我无法理解如何为此目的使用计数方法,而且我似乎无法在互联网上找到此类问题的任何示例或解释。

这就是我写的,它确实在计数部分给了我错误:

public Collection<String> countPatientsPerSpecialization(){
    patientsPerSp=
            lista_dottori.values().stream()
            .map(Doctor::getSpecialization)
            .collect(groupingBy(Doctor::getSpecialization, counting(Doctor::getPatients.size())))
            ;
}
4

3 回答 3

1

似乎您想汇总患者列表的大小。这可以由summingInt()收集器完成,而不是counting()(仅计算发生次数;在这种情况下是医生)。这里似乎也不需要映射。所以你可以写:

patientsPerSp = lista_dottori.values().stream()
        .collect(groupingBy(Doctor::getSpecialization, 
                 summingInt(doctor -> doctor.getPatients().size())));

请注意,如果多个医生有相同的患者,结果将是不正确的(这样会被计算多次)。如果在您的情况下可能,那么制作一组患者可能会更好:

patientsPerSp = lista_dottori.values().stream()
        .collect(groupingBy(Doctor::getSpecialization, 
                 mapping(Doctor::getPatients(), toSet())));

这样,您将拥有一张将专业化映射到患者组的地图,因此该组的大小将是您想要的计数。如果您只需要不设置的计数,您可以通过以下方式添加最后一步collectingAndThen()

patientsPerSp = lista_dottori.values().stream()
        .collect(groupingBy(Doctor::getSpecialization, 
                 collectingAndThen(
                     mapping(Doctor::getPatients(), toSet()),
                     Set::size)));
于 2015-05-23T15:43:59.227 回答
0

我解决了避免使用流的问题。这就是我使用的解决方案:

public Collection<String> countPatientsPerSpecialization(){

    int numSpec = 0;
    Map<String, Integer> spec = new HashMap<>();

    for(Doctor d : lista_dottori.values()){
        if(!spec.containsKey(d.getSpecialization())){
            spec.put(d.getSpecialization(), d.getPatients().size());
            numSpec++;
        }
        else{ //cioè se la specializzazione c'è già
            spec.replace(d.getSpecialization(), +d.getPatients().size()); 
        }
    }
    patientsPerSp.add(spec.keySet() + ": " + spec.values());
    for(String s : patientsPerSp)
        System.out.println(s);
    return patientsPerSp;
}

我似乎无法使用您的解决方案来解决它,尽管它们暴露得很好,抱歉。无论如何,谢谢你花时间回答

于 2015-05-27T11:15:09.630 回答
0
    Map<String, Integer> patientsPerSpecialization =
            doctors.values()
            .stream()
            .collect(Collectors.groupingBy(Doctor::getSpecialization,
                   Collectors.summingInt(Doctor::nberOfAssignedPatients)));
于 2021-09-12T22:23:28.413 回答