日期:2014-05-19  浏览次数:20723 次

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的函数很少有不允许用的吧