alexandertech 大哥你好:
在这个帖子里面,你在7楼的位置回复了关于按时间范围合并的问题
http://topic.csdn.net/u/20110627/17/c7dc82d9-4f18-4f4e-a66b-e779dba88424.html
但是,你的算法是已name+dateT为升序.来求时间范围的
我现在想已dateT+name为升序.来完成这个需求.请问在你的那个算法中, 怎么去修改呢?
在这个帖子里面,你在7楼的位置回复了关于按时间范围合并的问题
http://topic.csdn.net/u/20110627/17/c7dc82d9-4f18-4f4e-a66b-e779dba88424.html
但是,你的算法是已name+dateT为升序.来求时间范围的
我现在想已dateT+name为升序.来完成这个需求.请问在你的那个算法中, 怎么去修改呢?
如果按照dateT+name排序,需要累加的记录在原数组中可能并不相邻,在原算法中修改也可以做到,不过代码失之简洁,可读性变差,维护开销增大。
我给你写了个入口数组完全混乱版,可以处理任何顺序的输入,程序执行的时间开销和上一个代码仍然是同一个数量级,甚至可读性还提高了,前提是ClassBean中要重写Object的equals()和hashCode()方法
/* 参数
* list ---- 待合并数组
* mins ---- 待合并分钟数
* 返回
* 合并后数组
*/
public static List<ClassBean> combine2(List<ClassBean> list, int mins) {
List<ClassBean> newlist = new ArrayList<ClassBean>();
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
HashMap<ClassBean, ClassBean> map = new HashMap<ClassBean, ClassBean>();
long gap = mins * 60 * 1000, gapid;
for (int i = 0; i < list.size(); i++) {
ClassBean cb = list.get(i).clone();
gapid = (df.parse(cb.getDateT()).getTime()-1)/gap;
cb.setDateT(df.format(new Date((gapid+1)*gap)));
if (map.containsKey(cb))
map.get(cb).setNum(map.get(cb).getNum()+cb.getNum());
else {
map.put(cb, cb);
newlist.add(cb);
}
}
} catch (Exception e) { System.out.println(e); }
return newlist;
}
重写equals()和hashCode()的ClassBean.java:public class ClassBean {
private String name;
private String dateT;
private int num; public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getDateT() {return dateT;}
public void setDateT(String dateT) {this.dateT = dateT;}
public int getNum() {return num;}
public void setNum(int num) {this.num = num;}
public boolean equals(Object cb) {
if (cb instanceof ClassBean)
return ((ClassBean)cb).getName().equals(name) && ((ClassBean)cb).getDateT().equals(dateT);
return false;
}
public int hashCode() {
return name.hashCode() + dateT.hashCode();
}
public ClassBean clone() {
ClassBean cb = new ClassBean();
cb.setName(name);
cb.setDateT(dateT);
cb.setNum(num);
return cb;
}
}