java - 对列表中的值求和。我可以更有效地做到这一点吗?

标签 java performance list

我有一个事实对象列表。每个对象都有一个日期字段 (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/

相关文章:

java - 如何在Java中制作一个向下的数字三角形?

java - 如何使用 DOM append 现有 XML 文件而不覆盖现有数据?

forms - 如何自动创建包含来自自定义 SharePoint 列表的列表字段的 Word 文档?

python - 如何从元组列表中找到频率最高的 3 个元素?

python - 如何将 "[nan,1,2,3]"字符串转换为列表 [nan,1,2,3]?

java - 无法通过登录页面

java - 数组和字符串充当对象

c++ - 自定义语言中 C++ 的 C-Wrapper DLL 的性能

php - 禁用模块会提高 PHP 性能吗?

.net - XPathNavigator 和 XmlReader 之间的速度差异到底有多大?