Dictionary 使用流进行映射时出错
我目前在弄清楚如何使用Java8流方面遇到了困难。 我正试图从Dictionary 使用流进行映射时出错,dictionary,java-8,java-stream,counting,collectors,Dictionary,Java 8,Java Stream,Counting,Collectors,我目前在弄清楚如何使用Java8流方面遇到了困难。 我正试图从lista_dottori(Map)到一个新的地图patientsPerSp,每个医学专业的位置(方法getspecification)我绘制了拥有该专业医生的患者数量(方法getPatients在classDoctor中返回该医生的患者的列表)。我不知道如何使用计数方法实现这一目的,而且我似乎在互联网上找不到任何关于这类问题的示例或解释 这就是我写的,它确实给了我计数部分的错误: public Collection<Strin
lista_dottori
(Map
)到一个新的地图patientsPerSp
,每个医学专业的位置(方法getspecification
)我绘制了拥有该专业医生的患者数量(方法getPatients
在classDoctor
中返回该医生的患者的列表)。我不知道如何使用计数方法实现这一目的,而且我似乎在互联网上找不到任何关于这类问题的示例或解释
这就是我写的,它确实给了我计数部分的错误:
public Collection<String> countPatientsPerSpecialization(){
patientsPerSp=
lista_dottori.values().stream()
.map(Doctor::getSpecialization)
.collect(groupingBy(Doctor::getSpecialization, counting(Doctor::getPatients.size())))
;
}
public Collection countPatientsPerSpecialization(){
病人员=
lista_dottori.values().stream()
.map(医生::getSpecialization)
.collect(分组依据(医生::getSpecialization,计数(医生::getPatients.size()))
;
}
似乎您希望对患者列表的大小求和。这可以通过summingit()
收集器来完成,而不是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())));
通过这种方式,您将拥有一个映射专门化到患者集合的映射,因此此集合的大小将是您想要的计数。如果您只需要不带集合的计数,您可以通过collecting and then()添加最后一步:
我解决了避免使用流的问题。这就是我使用的解决方案:
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;
}
public Collection countPatientsPerSpecialization(){
int numSpec=0;
Map spec=newhashmap();
对于(医生d:lista_dottori.values()){
如果(!spec.containsKey(d.getSpecialization())){
spec.put(d.getSpecialization(),d.getPatients().size());
numSpec++;
}
否则{//cioèse la specializazione c'giá
规格替换(d.getSpecialization(),+d.getPatients().size());
}
}
patientsPerSp.add(spec.keySet()+”:“+spec.values());
for(字符串s:patientsPerSp)
系统输出打印项次;
返回病人组;
}
我似乎无法使用您的解决方案来解决问题,尽管它们被很好地公开了,抱歉。
无论如何,感谢您抽出时间回答不要描述您的类。发布它们的代码。感谢您的回答,它解释得很好。它仍然给了我一些问题,它总是告诉我类型诊所有一个未定义的方法(它是类的名称).第一个是Summingit,第二个是toSet…我忘了导入一些东西吗?对不起,你的问题中没有关于Clinic
类的内容,所以我不太可能在这里帮助你。如果问题仍然没有解决,那么最好单独问一个问题。
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;
}