App升级案例

数据:
日期,用户名,app名,下载渠道,所在城市,app版本
2017-08-15,ls,陌陌,app store,上海,v2.9
2017-08-15,ls,脉脉,360应用e,上海,v2.3
2017-08-15,wls,陌陌,app store,上海,v2.6
2017-08-15,wls,陌陌,360应用,上海,v2.7
2017-08-15,lp,脉脉,app store,北京,v2.3
2017-08-16,lp,陌陌,app store,东京,v2.8
2017-08-15,ls,脉脉,360应用,上海,v2.4
2017-08-15,wls,陌陌,app store,上海,v2.9

需求:
统计出每天的版本升级情况,例如:
2017-08-14 lp 陌陌 360应用 v1.0 v1.2
2017-08-15 ls 脉脉 360应用 v2.4

分析:

这里写图片描述

上图红色方框选中的行 放入Bean 中作为TreeMap的key,以便按日期进行排序
列 作为value,因为有多个Bean是一样的,为了value不会被覆盖,使用List存储

Bean:

public class AppBean implements Comparable<AppBean>{
    //2017-08-15,刘帅老师,陌陌,app store,上海,v2.9
    private String date;
    private String name;
    private String app;
    private String appStore;

为了实现排序,在Bean中实现Comparable接口,重写CompareTo方法:

注意: 多维度去比较,如果只比较日期,会造成数据损失

public int compareTo(AppBean o) {
        int res = 0;
        try {
            String d1 = this.getDate();
            String d2 = o.getDate();
            //正则表达式,解析String日期,转成长整型
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            long t1 = sdf.parse(d1).getTime();
            long t2 = sdf.parse(d2).getTime();
            res = t1>t2?1:t1==t2?0:-1;
            //如果日期相同比较名字
            if(res == 0) {
                res = this.getName().compareTo(o.getName());
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return res;
    }

main方法

        //使用TreeMap,key->AppBean,实现comparable接口,按时间升序
        Map<AppBean, List<String>> map = new TreeMap<>();
        BufferedReader br = new BufferedReader(new FileReader("d:/data/app.txt"));
        String line;
        while((line = br.readLine())!=null) {
            //2017-08-15,刘帅老师,陌陌,app store,上海,v2.9
            String[] split = line.split(",");
            String date=split[0];
            String name=split[1];
            String app=split[2];
            String appStore=split[3];
            String version=split[5];
            AppBean bean = new AppBean(date, name, app, appStore);
            //map中如果有bean,则返回value,否则返回创建的list
            List<String> list = map.getOrDefault(bean, new ArrayList<>());
            list.add(version);
            //添加到map中,完成第一步,按key的日期排序
            map.put(bean, list);
        }

map中value排序,打印

        //对map排序,先转成set
        Set<Entry<AppBean, List<String>>> set = map.entrySet();
        for (Entry<AppBean, List<String>> entry : set) {
            List<String> list = entry.getValue();
            //对list进行升序,使用字符串的compareto方法,按词典顺序升序
            Collections.sort(list, (o1,o2)->o1.compareToIgnoreCase(o2));
            System.out.println(entry.getKey()+"->"+list);
            //[date=2016-08-14, name=刘帅老师, app=美拍, appStore=app store]->[v1.2, v1.2, v1.8]
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值