目前我正在使用 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/