java中的一个统计问题不知该如何写运行效率比较高?
问题详情
1. 有对象
- Java code
import java.util.Date;public class Disple { private Date time; private int number; public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; }}2. Case
public class Test{
private List<Disple> disple_ls = new ArrayList<Disple>();
}
3 . 该集合中有 n 个 Disple 实体对象,如果多个实体中的 time 属性的值相等,那么把这些实体对象中的 number 全累加起来
,组合成一个新的 Disple , 并添加到集合里。
本人有一个笨拙的写法,效率不好,代码也很难看。希望给位路过的高手指点一二. 其中传进去的 集合 中放的结果 是根据time排过序的 ,该结果集由数据库查出...
- Java code
import java.util.ArrayList;import java.util.List;public class Silmpe { public List<Disple> disple_summary(List<Disple> list_ds) { List<Disple> list_dres = new ArrayList<Disple>(); for (int i = 0; i < list_ds.size(); i++) { Disple dis = list_ds.get(i); int _tmp = 0; boolean flag = false; Disple dis_res = new Disple(); if ((i + 1) != list_ds.size()) { if (dis.getTime() == list_ds.get(i + 1).getTime()) { _tmp += dis.getNumber(); flag = true; } else { dis_res.setTime(dis.getTime()); dis_res.setNumber(_tmp + dis.getNumber()); list_dres.add(dis_res); _tmp = 0; } } if ((i + 1) == list_ds.size() && flag == true) { dis_res.setTime(list_ds.get(list_ds.size() - 1).getTime()); dis_res.setNumber(_tmp + list_ds.get(list_ds.size() - 1).getNumber()); list_dres.add(dis_res); } } return list_dres; }}[解决办法]
差不多也就这样了,一次遍历搞定,如果不太依赖于for的话,大概其可以少点判断和标志位。
不过其实建议直接靠数据库搞定:
Select timer, sum(num)
From xxoo
Order By timer
[解决办法]
你可以用个map来实现可能看起来清晰些
List<Disple> list_dres = new ArrayList<Disple>();
Map<Date, Disple> map = new HashMap<Date, Disple>();
for(Disple disple : list_dres) {
Disple temp = map.get(disple.getTime());
if(temp == null) {
map.put(disple.getTime(), disple));
} else {
temp.setNumber(temp.getNumber() + disple.getNumber());
}
}
//在把map转换为list
你们不允许用其他函数很奇怪啊,应该是不允许用数据库自身特有的函数吧,想T-SQL的函数很少有不允许用的吧