我正在使用java中的流训练。
这是请求: 返回字符串列表 包含医生的姓名和患者的相对人数 按数字减少排序。 该字符串必须格式化为“###:ID SURNAME NAME”,其中### 代表患者数量(印在三个字符上)。
public Collection<String> doctorsByNumPatients(){
SortedMap<Integer, List<String>> a= doctors.values().stream().
collect(groupingBy(d->d.getPatients().size(), ()->new TreeMap<Integer, List<String>>(reverseOrder()), mapping(Doctor::toString, toList())));
return a.entrySet().stream().
??????????
}
(Doctor :: toString返回ID NAME SURNAME)
我写了这段代码,但我无法完成它因为我不知道如何使用流将地图转换为请求中建议的字符串列表。我解决了一个类似的问题,但处理了一个循环,其中每次迭代我初始化一个迭代器来扫描值(列表)并为任何列表中的每个医生生成一个字符串。
答案 0 :(得分:0)
很好的尝试。
我建议:
public Collection<String> doctorsByNumPatients() {
return doctors.values()
.stream()
.sorted(Comparator.comparing((Doctor d) -> d.getPatients().size()).reversed())
.map(d -> String.format("%3d %s", d.getPatients().size(), d.toString()))
.collect(Collectors.toList());
}
正如评论中所建议的那样,我正在避开中间地图,只是根据病人数量对医生进行分类。
显然,你可以按照你在问题中尝试的方式来完成,而且这不是彻头彻尾的愚蠢。你缺少的部分可能就像
return a.entrySet()
.stream()
.flatMap(e -> e.getValue().stream().map((String s) -> String.format("%3d %s", e.getKey(), s)))
.collect(Collectors.toList());
flatMap()
是当流中的每个元素都包含一个集合并且您希望将内部集合的每个元素作为外部流中的元素进行处理时使用的操作。在内部流的map()
操作中,我们可以访问内部元素s
和外部元素e
。