Java:按类型对列表元素进行分组
目前我正在使用Java6。对于出于种种原因。现在,我想按日期对列表中的所有元素进行分组,这样就不会为每个日期设置多个条目 假设我有一个结构如下的列表:Java:按类型对列表元素进行分组,java,optimization,Java,Optimization,目前我正在使用Java6。对于出于种种原因。现在,我想按日期对列表中的所有元素进行分组,这样就不会为每个日期设置多个条目 假设我有一个结构如下的列表: +==============+=============+ | dateHappened | pottyUses | +==============+=============+ | 10/09/2015 | 255 | +--------------+-------------+ | 10/09/2015 |
+==============+=============+
| 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,您必须将newHashMap();
更改为:new HashMap();
。更改它,答案就是您的。注意:因为我使用Java 6,您必须更改newHashMap();
到这个:新建HashMap();
。更改它,答案就是你的了。