巧用数据结构解决项目中遇到的问题

项目需求:

问题: 页面上的表格显示(以及数据库中的字段):日期,省市,新增用户,活跃用户

有相当一部分的“省市”字段为乱码


要求:将所有字段为乱码的省市记录都显示为”其它“,对每天省市为”其它“的新增用户,以及活跃用户数分别求和,然后只显示一条记录

难点分析:数据库中无法识别乱码(所以无法使用sum,group等函数),在List中比较难处理元素归并,求和等问题,在List中一边遍历一边删除元素的话会遇到线程同步问题等。。


思路:单独写一个方法用来判断乱码(若是乱码返回false),将List中字段是乱码的函数添加到map中(key是时间,value是新增用户,活跃用户等,map可以更加方便地进行归并,求和等操作),创建一个新的list对象,将list中的所有元素拷贝过去,然后其中一个用于判断,另外一个用于添加删除,这样可以解决list线程同步问题

代码如下:

判断是乱码的方法: 

public static boolean cclm(String source) {
        boolean flag = true;
        char ws[] = new char[] { '"', '?', ' ', '\'', '&' };
        for (int i = 0; i < source.length(); i++) {
            char c = source.charAt(i);
            for (int j = 0; j < ws.length; j++) {
                char v = ws[j];
                if (c == v) {
                    flag = false;
                }
            }
            if ((int) c == 0xfffd) {
                flag = false;
            }
        }
        return flag;
    }


其它部分逻辑代码(GeneralGeogDisDomain是自定义的一个对象用来封装日期,省市,新增用户,活跃用户):

List<GeneralGeogDisDomain> list = new ArrayList<GeneralGeogDisDomain>();

List<GeneralGeogDisDomain> list_new = new ArrayList<GeneralGeogDisDomain>();

Map<Long, Long> newNumMap = new HashMap<Long, Long>();
Map<Long, Long> numMap = new HashMap<Long, Long>();

for (GeneralGeogDisDomain geodis1 : list_new) {
if (!Utils.cclm(geodis1.getProvince())) {
if (null == newNumMap.get(geodis1.getTime())) {
newNumMap.put(geodis1.getTime(),
geodis1.getNewUserNum());
} else {
Long temNewNum = newNumMap.get(geodis1.getTime());
newNumMap.remove(geodis1.getTime());
newNumMap.put(geodis1.getTime(),
temNewNum + geodis1.getNewUserNum());
}
if (null == numMap.get(geodis1.getTime())) {
numMap.put(geodis1.getTime(), geodis1.getNum());
} else {
Long temNum = numMap.get(geodis1.getTime());
numMap.remove(geodis1.getTime());
numMap.put(geodis1.getTime(), temNum + geodis1.getNum());
}


list.remove(geodis1);
}
}


Iterator<Long> it = newNumMap.keySet().iterator();
Iterator<Long> nt = numMap.keySet().iterator();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");  
while (it.hasNext() && nt.hasNext()) {
GeneralGeogDisDomain g = new GeneralGeogDisDomain();
Long key = it.next();
Long newNum = newNumMap.get(key);
Long num = numMap.get(nt.next());
g.setNewUserNum(newNum);
g.setNum(num);
g.setProvince("其它");
g.setTime(sdf.format(new Date(key)));


list.add(g);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值