Java:按类型对列表元素进行分组

标签 java optimization

目前我正在使用 Java 6。出于...出于某些原因。现在我想按日期对列表中的所有元素进行分组,因此每个日期都没有多个条目。

假设我有一个结构如下所示的列表:

+==============+=============+
| dateHappened |  pottyUses  |
+==============+=============+
| 10/09/2015   |     255     |
+--------------+-------------+
| 10/09/2015   |     256     |
+--------------+-------------+
| 10/09/2015   |     254     |
+--------------+-------------+

我想把它变成这样:

+==============+=============+
| dateHappened |  pottyUses  |
+==============+=============+
| 10/09/2015   |     765     |
+--------------+-------------+

列表代码如下所示:

public class PottyCollection implements Comparable<PottyCollection>
{
    public PottyCollection(final Date dateHappened, final int pottyUses)
    {
        this.dateHappened = dateHappened;
        this.pottyUses = pottyUses;
    }
    final public Date dateHappened;
    final public int pottyUses;
}

到目前为止,我已经创建了两个单独的 PottyCollection 实例。第一个(完整)使用 Collections.Sort()Date 排序。第二个(空)然后遍历整个列表,对于我们找到的每个日期,它将在该日期之前增加 newPottyUses。当找到新日期时,它将所有数据插入新列表,并重置 newPottyUses,然后继续循环直到完成。

对于几个项目,这很好。对于包含许多不同类型的大型列表,它已经到了难以维护的地步。我忍不住觉得这里正在进行一些轮子的重新发明。

有没有更好的方法? Java 6 和 8 解决方案都将受到赞赏,但目前只能检查 6 个。

最佳答案

使用 map :

Map<Date, PottyCollection> map = new HashMap<>();
for (PottyCollection pc : originalList) {
    PottyCollection existing = map.get(pc.dateHappened);
    if (existing == null) {
        map.put(pc.dateHappened, pc);
    }
    else {
        map.put(pc.dateHappened, new PottyCollection(pc.dateHappened, pc.pottyUses + existing.pottyUses));
    }
}
Collection<PottyCollection> reduced = map.values();

关于Java:按类型对列表元素进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33614024/

相关文章:

java归并排序从最大到最小

c++ - 提高优化级别 g++

javascript - 具有通用属性的 CSSRules 组选择器

java - 在 Java 中是否有将 Object 转换为 String 的标准接口(interface)?

Java/从 Observable<List<String>> 转换为 List<String>

java - 如何在不离开jsp的情况下从servlet返回消息?

css - 使用 SASS mixin 还是创建单独的类更好?

java - Eclipse OSGI 未满足约束

sql - 为什么 Postgres 在此查询中执行哈希?

sql - 用于我的查询的 StringBuffer 或 StringBuilder