我有一个事实对象列表。每个对象都有一个日期字段 (reportingDate) 和一个长字段 (numberSaved)。每个 reportingDate 都有几个结果。我正在尝试获取每个报告日期的所有 numberSaved 值的总和。目前,我是这样做的:
private static List<Fact> sumFacts(List<Fact> facts) {
List<Fact> summedFacts = new ArrayList<Fact>();
for (Fact fact : facts) {
boolean found = false;
for (Fact sumFact : summedFacts) {
if(sumFact.getReportingDate().equals(fact.getReportingDate())) {
found = true;
sumFact.setNumberSaved(sumFact.getNumberSaved() + fact.getNumberSaved());
}
}
if (!found) summedFacts.add(fact);
}
return summedFacts;
}
public class Fact {
String reportingDate;
long numberSaved;
public String getReportingDate() {
return reportingDate;
}
public void setReportingDate(String reportingDate) {
this.reportingDate = reportingDate;
}
public long getNumberSaved() {
return numberSaved;
}
public void setNumberSaved(long numberSaved) {
this.numberSaved = numberSaved;
}
}
对于原始列表中的每个项目,它遍历新列表以查找匹配的日期。如果找到具有匹配日期的对象,它会将其 numberSaved 值添加到其中。如果它通过了整个列表而没有找到匹配的日期,它会将自己添加到新列表中。
有没有更有效的方法可以将值汇总到具有唯一日期的 Fact 对象列表中?
编辑:
我忘了说我需要维护项目的顺序
最佳答案
与其将事实保存在 List
中并对其进行迭代(产生 O(n^2) 复杂度),不如将它们存储在 map 中,形成报告日期到事实对象,给你一个 O(n) 复杂度:
private static List<Fact> sumFacts(List<Fact> facts) {
Map<String, Fact> summedFacts = new HashMap<Fact>();
for (Fact fact : facts) {
summedFact = summedFacts.get(fact.getReportingDate());
if (summedFact == null) {
summedFacts.put (fact.getReportingDate(), fact);
} else {
summedFact.setNumberSaved(summedFact.getNumberSaved() + fact.getNumberSaved());
}
}
return new ArrayList<Fact>(summedFacts.values());
}
关于java - 对列表中的值求和。我可以更有效地做到这一点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697673/