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

Java:按类型对列表元素进行分组,java,optimization,Java,Optimization,目前我正在使用Java6。对于出于种种原因。现在,我想按日期对列表中的所有元素进行分组,这样就不会为每个日期设置多个条目 假设我有一个结构如下的列表: +==============+=============+ | dateHappened | pottyUses | +==============+=============+ | 10/09/2015 | 255 | +--------------+-------------+ | 10/09/2015 |

目前我正在使用Java6。对于出于种种原因。现在,我想按日期对列表中的所有元素进行分组,这样就不会为每个日期设置多个条目

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

+==============+=============+
| dateHappened |  pottyUses  |
+==============+=============+
| 10/09/2015   |     255     |
+--------------+-------------+
| 10/09/2015   |     256     |
+--------------+-------------+
| 10/09/2015   |     254     |
+--------------+-------------+
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;
}
我想把它变成这样:

+==============+=============+
| dateHappened |  pottyUses  |
+==============+=============+
| 10/09/2015   |     765     |
+--------------+-------------+
列表代码如下所示:

+==============+=============+
| dateHappened |  pottyUses  |
+==============+=============+
| 10/09/2015   |     255     |
+--------------+-------------+
| 10/09/2015   |     256     |
+--------------+-------------+
| 10/09/2015   |     254     |
+--------------+-------------+
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实现了可比较的
{
公共便盆收集(最终日期发生,最终整数便盆)
{
this.datecoursed=datecoursed;
this.pottyUses=pottyUses;
}
最终公布日期;
最后的公共卫生服务;
}
到目前为止,我已经创建了两个独立的
PottyCollection
实例。使用
Collections.Sort()。第二个(空)然后在整个列表中循环,对于我们找到的每个日期,它将在该日期之前增加
newPottyUses
。当找到新的日期时,它会将所有数据插入新列表,并重置
newPottyUses
,然后继续循环直到完成

对于一些项目,这是好的。对于一个包含许多不同类型的大型列表,它已经到了不可维护的地步。我忍不住觉得这里正在进行一些车轮改造

有更好的办法吗?Java6和Java8解决方案都将受到欢迎,但目前只能检查6个

使用地图:

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();
Map Map=newhashmap();
用于(PottyCollection pc:原始列表){
PottyCollection existing=map.get(pc.dateOccessed);
if(现有==null){
地图放置(pc.DateOccessed,pc);
}
否则{
map.put(pc.dateoccurrent,new PottyCollection(pc.dateoccurrent,pc.pottyUses+existing.pottyUses));
}
}
集合减少=map.values();
使用地图:

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();
Map Map=newhashmap();
用于(PottyCollection pc:原始列表){
PottyCollection existing=map.get(pc.dateOccessed);
if(现有==null){
地图放置(pc.DateOccessed,pc);
}
否则{
map.put(pc.dateoccurrent,new PottyCollection(pc.dateoccurrent,pc.pottyUses+existing.pottyUses));
}
}
集合减少=map.values();

您是否考虑过使用
树状图而不是
列表

TreeMap
的元素自然地按照其键排序。此外,通过覆盖
put
方法,可以检测某个日期是否已经存在

代码示例:

import java.util.Date;
import java.util.TreeMap;

public class PottyCollection extends TreeMap<Date, Integer> {
    @Override
    public Integer put(Date key, Integer value) {
        if (containsKey(key)) {
            return super.put(key, get(key) + value);
        } else
            return super.put(key, value);
    }


    public static void main(String[] args) {
        PottyCollection collection = new PottyCollection();
        collection.put(new Date(0), 100);
        collection.put(new Date(1), 55);
        collection.put(new Date(0), 55);

        System.out.println(collection);
    }
}
{Thu Jan 01 01:00:00 CET 1970=155, Thu Jan 01 01:00:00 CET 1970=55}

您是否考虑过使用
树映射
而不是
列表

TreeMap
的元素自然地按照其键排序。此外,通过覆盖
put
方法,可以检测某个日期是否已经存在

代码示例:

import java.util.Date;
import java.util.TreeMap;

public class PottyCollection extends TreeMap<Date, Integer> {
    @Override
    public Integer put(Date key, Integer value) {
        if (containsKey(key)) {
            return super.put(key, get(key) + value);
        } else
            return super.put(key, value);
    }


    public static void main(String[] args) {
        PottyCollection collection = new PottyCollection();
        collection.put(new Date(0), 100);
        collection.put(new Date(1), 55);
        collection.put(new Date(0), 55);

        System.out.println(collection);
    }
}
{Thu Jan 01 01:00:00 CET 1970=155, Thu Jan 01 01:00:00 CET 1970=55}

遗憾的是,只有6个(然而,我非常愿意看到这两种解决方案。遗憾的是,只有6个:(然而,我会非常乐意看到这两种解决方案。为什么我要在
地图上使用
树形图
?哪一种更适合这个特定场景?@EduardoScissaro,
树形图
的元素是使用关键元素的
比较
方法排序的(这里是日期)因此,
TreeMap
中的所有元素都会自动按日期排序。我认为这很重要,因为OP的
PottyCollection
实现了
compariable
接口。太好了。如果我在这个列表中有多个数据类型呢?
扩展TreeMap
…?显然这不起作用,因为它是ode>K,V
,但我如何将其用于多种数据类型?将
collection.put(新日期(0),0,“,”,22000,0)
用于此操作?扩展树映射是一个非常糟糕的主意。put()方法不尊重映射契约。使用putAll()而不是put()有很好的机会破坏代码,等等。赞成委托而不是继承。为什么我要使用
树形映射而不是
映射
?哪一个更适合这个特定场景?@EduardoScissaro,
树形映射
的元素是使用关键元素的
比较
方法排序的(这里是日期)因此,
TreeMap
中的所有元素都会自动按日期排序。我认为这很重要,因为OP的
PottyCollection
实现了
compariable
接口。太好了。如果我在这个列表中有多个数据类型呢?
扩展TreeMap
…?显然这不起作用,因为它是ode>K,V
,但我如何将其用于多种数据类型?将
collection.put(新日期(0),0,“,”,22000,0)
用于此操作?扩展树映射是一个非常糟糕的主意。put()方法不尊重映射契约。使用putAll()而不是put()有很好的机会破坏代码,等等。支持委托而不是继承。注意:由于我使用Java 6,您必须将new
HashMap();
更改为:
new HashMap();
。更改它,答案就是您的。注意:因为我使用Java 6,您必须更改new
HashMap();
到这个:
新建HashMap();
。更改它,答案就是你的了。