【发布时间】:2021-12-02 03:22:49
【问题描述】:
我正在尝试使用 hashmap 来统计每天的疾病数量:
public static main(String[] args){
Disease cholera=new Disease("cholera");
Disease dengue=new Disease("dengue");
List<Diagnosis> diagnoses = Arrays.asList(
new Diagnosis(cholera, 0), // registered cholera on day 0
new Diagnosis(cholera, 0),
new Diagnosis(cholera, 1),
new Diagnosis(cholera, 1),
new Diagnosis(cholera, 2),
new Diagnosis(cholera, 2)
);
printFreq(diagnosis);
}
public static void printFreq(List<Diagnosis> diagnoses) {
Map<Diagnosis, Integer> hm = new HashMap();
for (Diagnosis x : diagnoses) {
if (!hm.containsKey(x)) {
hm.put(x, 1);
} else {
hm.put(x, hm.get(x) + 1);
}
}
但如果我调用 printFreq(diagnoses) 我会得到:{{cholera, 0}=1, {cholera, 1}=1, {cholera, 2}=1, {cholera, 0}=1, {dengue, 0}=1,{霍乱,1}=1,{霍乱,2}=1}。我该如何解决这个问题 {{cholera,0}=2,{dengue0}=1,{cholera,1}=2,{cholera,2}=2}}
我不能更改诊断或疾病类,但它们看起来是这样的:
public class Disease {
private final String name;
public Disease(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Disease disease = (Disease) o;
return name.equals(disease.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public String toString() {
return name;
}
诊断:
public class Diagnosis {
private final Disease disease;
private final int day;
public Diagnosis(Disease disease, int day) {
this.disease = disease;
this.day = day;
}
public Disease getDisease() {
return disease;
}
public int getDay() {
return day;
}
@Override
public String toString() {
return "{" + disease + ", " + day + "}";
}
【问题讨论】:
-
听起来你真的应该有一个
Map<Disease, Integer>而不是Map<Diagnosis, Integer>。毕竟,您正在尝试计算一天疾病的数量...... -
@JonSkeet 我实际上想计算某种疾病每天登记的次数,而不是总数。抱歉,如果我的描述不清楚。
-
如果您能包含 预期 结果,这将非常有帮助 - 目前我发现很难理解您想要实现的目标。跨度>
-
@sushant:说清楚的方法是在问题中有一个明确的例子。如果有不止一种疾病,如果该示例也显示了这一点,那将非常有帮助......目前它仅显示霍乱。我不知道 OP 期望如何表示(在输入数据或输出数据中)“在第 0 天,我们诊断出 3 例霍乱和 2 例 covid”。
-
@JonSkeet 我完全同意。我看到预期的输出有 {dengue0}=1。所以基于此,我的猜测是 OP 在代码中有错字,或者错过了将
new Diagnosis(dengue, 0)添加到diagnoses列表中。