虽然计数公式有点奇怪(计数不同的主题 + 计数 sessionTime),但我猜你的意思是 Map<Integer, Map<String, List<String>>>。我想出了两种方法,如有需要请修改。
public class Dummy {
public Map<Integer, Integer> countHours(List<Submission> submissions) {
Map<Integer, Integer> res = new HashMap<>();
Map<Integer, Set<String>> subjectMap = new HashMap<>();
Map<Integer, List<String>> sessionTimeMap = new HashMap<>();
for (Submission s : submissions) {
subjectMap.computeIfAbsent(s.getStaffId(), v -> new HashSet<>()).add(s.getSubject());
sessionTimeMap.computeIfAbsent(s.getStaffId(), v -> new ArrayList<>()).add(s.getSessionTime());
}
for (Map.Entry<Integer, Set<String>> e : subjectMap.entrySet()) {
res.put(e.getKey(), e.getValue().size());
}
for (Map.Entry<Integer, List<String>> e : sessionTimeMap.entrySet()) {
res.merge(e.getKey(), e.getValue().size(), Integer::sum);
}
return res;
}
public Map<Integer, Integer> countHours2(List<Submission> submissions) {
Map<Integer, Map<String, Long>> collect = submissions.stream()
.collect(Collectors.groupingBy(Submission::getStaffId,
Collectors.groupingBy(Submission::getSubject, Collectors.counting())));
return collect.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().size() +
e.getValue().values().stream().mapToInt(Number::intValue).sum()));
}
@Test
public void test() {
List<Submission> submissions = new ArrayList<>();
submissions.add(new Submission(9600001, "info2001", "Tue3"));
submissions.add(new Submission(9600001, "info2002", "Wed4"));
submissions.add(new Submission(9600002, "info2001", "Wed2"));
submissions.add(new Submission(9600001, "info2001", "Thu9"));
submissions.add(new Submission(9600001, "info2003", "Fri10"));
submissions.add(new Submission(9600002, "info2004", "Wed4"));
System.out.println(countHours(submissions)); // {9600002=4, 9600001=7}
System.out.println(countHours2(submissions)); // {9600002=4, 9600001=7}
}
}
// In case you have lombok
@Data
@AllArgsConstructor
class Submission {
private int staffId;
private String subject;
private String sessionTime;
// In case you do not have lombok
// Submission(int staffId, String subject, String sessionTime) {
// this.staffId = staffId;
// this.subject = subject;
// this.sessionTime = sessionTime;
// }
//
// public int getStaffId() {
// return staffId;
// }
//
// public void setStaffId(int staffId) {
// this.staffId = staffId;
// }
//
// public String getSubject() {
// return subject;
// }
//
// public void setSubject(String subject) {
// this.subject = subject;
// }
//
// public String getSessionTime() {
// return sessionTime;
// }
//
// public void setSessionTime(String sessionTime) {
// this.sessionTime = sessionTime;
// }
}