java基础增强:统计网上app下载情况,并排序

Posted zdl9857

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础增强:统计网上app下载情况,并排序相关的知识,希望对你有一定的参考价值。

一入编程深似海,从此妹子是路人。

案例:

  统计网站app下载的情况,后台数据如下:

    日期,用户名,app名,下载渠道,所在城市,app版本

    2017-08-15,xx老师,陌陌,app store,上海,v2.9

    2017-08-15,xx老师,脉脉,jdk1.8,上海,v2.3

    2017-08-15,oo老师,陌陌,app store,上海,v2.6

    。。。。。。。多条上述格式的数据

效果要求:

  要求统计完后的表示格式:

 

  统计出每天的app版本升级情况

日期

用户名

app

新版本下载渠道

升级前版本

升级后版本

  统计结果示例如下:app的下载渠道分开来看

2017-08-14

xx

app

360应用

v1.0

v1.2

2017-08-15

xx

app

小米应用

v1.2

v2.0

功能分析:

  1、后台所提供的数据信息为 :日期,用户名,app名,下载渠道,城市,版本。

  2、案例要求输出的格式为: 日期,用户名,app名,下载渠道,城市,低版本,新版本。

  3、利用Map集合将 日期,” 用户名,app名,下载渠道,城市 ”  作为key,版本为value

  4、进行拼接,当key值向同时,将这两个key映射的两个value添加到一个List集合中。

  5、将所添加了value的list集合进行排序。

  6、此时list中可能存在三种情况:

    只有一个value。(不符合接个需要不打印)。

    有两个value。 (按版本先后排序)。

    有多个value。 (只想list中添加最低版本和最高版本)

  7、根据mapkey获取其对应的版本list,判断出长度,确定用户是否更新版本将用户信息及用户版本更新数据封装到Bean

    将Bean放在List中,然后按照时间排序

  8、通过控制台输入标识来选择排序条件,和排顺序的顺序。

实现代码:

   Appbean代码:

    自行添加有参构造方法,get/set方法,toString方法。

public class PersonBean {
        private String data;
        private String Usr;
        private String app;
        private String downPatch;
        private String city;
        private String preUpgrade;
        private String Upgrade;
        public PersonBean(String data, String usr, String app, String downPatch,  String city,String preUpgrade,String upgrade) {
            this.data = data;
            this.Usr = usr;
            this.app = app;
            this.downPatch = downPatch;
            this.city=city;
            this.preUpgrade=preUpgrade;
            this.Upgrade = upgrade;
        }

  功能代码:

      技术分享图片

main方法:

//由于是练习,所以集合,或者文件为空等异常直接抛出了。可根据自己的需求自行捕获处理。
    public static void main(String[] args) throws Exception  {
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();
            //得到拍好格式的List<PersonBean>集合
            List<PersonBean> list = getList();
            //对list排序后,返回int值
            int key = sortTest(str,false,list);
            if( key!=-1) { 
                for (PersonBean p : list) {
                    System.out.println(p);
            }
            }
        
    }

比较方法:

/**
 * 比较方法    
 * @param str 按什么条件排序(日期,地区)
 * @param isAcd true:升序  false:降序
 * @param list 需要排序的集合
 * @return 标识
 */
public static int sortTest(String str,boolean isAcd, List<PersonBean> list)  {
    
    if( str.equals("日期")) { 
        //对排好格式的list<Personbean>集合进行排序
                sortData(list,isAcd); 
    }else if( "地区".equals(str)) { 
        sortCity(list,isAcd);
    } else { 
        System.out.println("请从“日期”或者“地区”选择一个作为查询条件。。。");
        return -1;
    }
    return 0;    
    }

getMap方法:

/**
 * 将读入的数据信息惊醒分割,并存入一个Map中,并返回map
 * @return map对象
 * @throws Exception 此异常为抛出异常,未作处理
 */
public static HashMap<String, List<String>> getMap() throws Exception{
     HashMap<String, List<String>> map = new HashMap<String,List<String>>();
     //创建缓冲字符流
     BufferedReader br = new BufferedReader(new FileReader("C:\\\\Users\\\\zhangdali\\\\Desktop/count.txt"));
     //读取文档
     String line;
     while(( line = br.readLine())!=null) { 
         //对读取的数据进行分割
         String[] split = line.split(",");
         //此处将版本前面的所有变量组成的字符串作为Key,目的在于可以单独操作,版本这个变量。
         //因为案例需求为,日期,用户,app,地址,城市,低版本,高版本。此处要做的就是吧高低版本这俩变量
         //从两条语句中整合到一条中。(共同点:这两条数据Key值相同)。
         String key = split[0] +"," +split[1] + "," + split[2] + "," + split[3] +","+split[4];
         String value = split[5];
         //如果key相同,返回一个List集合接受对应的value值。
        List<String> list = map.getOrDefault(key, new ArrayList<>());
        list.add(value);
        //对存入的版本号信息,按要求从低版本到高版本进行排序版本
        sort(list);
        map.put(key, list);
     }
     //关流
     br.close();
     return map; 
 }

getList方法:

/**
 * getList<PersonBean>
 * 获得储存格式为:日期,用户,APP,下载途径,城市,低版本,高版本。的list<PersonNean>
 * @return list
 * @throws Exception 可能list为空,可捕获处理。(此处选择抛出)
 */
public static List<PersonBean> getList() throws Exception {
    //创建泛型为PersonBean的List集合,用来添加PersonBean的属性。
            //通过对llist进行排序,和遍历
            List<PersonBean> list = new ArrayList<PersonBean>();
            //获得添加了值的map集合
            HashMap<String,List<String>> map = getMap();
            //获得map集合的键值对集合
            Set<Entry<String,List<String>>> set = map.entrySet();
            //遍历键值对集合
            for (Entry<String, List<String>> entry : set) {
                //System.out.println(entry);打印键值对
                //获得每一个键值对所映射的key
                String key = entry.getKey();
                //对每一个key进行分割
                String[] split = key.split(",");
                 String data=split[0];
                 String usr=split[1];
                 String app=split[2];
                 String downPatch=split[3];
                  String city=split[4];
                 //获得键值对所映射的value值
                List<String> value = entry.getValue();
                //此时value是一个List集合,由于需求的要求,只有有两个value的list才可以被打印
                if(value.size()>1) { 
                    String preUpgrade = value.get(0);
                    String upgrade = value.get(value.size()-1);
                    PersonBean bean = new PersonBean(data, usr, app, downPatch, city, preUpgrade, upgrade);
                    list.add(bean);
                }
            }
            return list;
    }

对list<String > 进行排序:

/**
 * 对集合list进行排序
 * @param list
 */
public static void sort(List<String> list) {
        Collections.sort(list, new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                //按字典先后排序
                return o1.compareTo(o2);
            }
        });
}

按日期进行排序:

/**
 * 按下载日期的先后进行排序。
 * @param list 进行排序的集合
 * @param isAcd 为true进行升序,为false进行降序
 */
public static void sortData(List<PersonBean> list, boolean isAcd) {
         Collections.sort(list, new Comparator<PersonBean>() {

            @Override
            public int compare(PersonBean o1, PersonBean o2) {
                //通过对象.属性获得data(注意:此时得到的是String类型)
                String d1 = o1.getData();
                String d2 = o2.getData();
                //创建Format对象,用正则表达式进行格式控制
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                //使用format中的parse方法将d1,d2,转成Data类型
                try {
                    Date date1 = format.parse(d1);
                    Date date2 = format.parse(d2);
                    if( isAcd) { 
                        //升序
                        return date2.before(date1)?1:-1;
                    }else { 
                        //降序
                        return date1.before(date2)?1:-1;
                    }
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return 0;
            }
        });
    }

按地区排序:

/**
 * 按地区排序
 * @param list 进行排序的集合
 * @param isAcd true:按字典升序,false:按字典降序
 */
@SuppressWarnings("unchecked")
private static void sortCity(List<PersonBean> list,boolean isAcd) {
    Collections.sort(list, new Comparator<PersonBean>() {

        @Override
        public int compare(PersonBean o1, PersonBean o2) {
            if(isAcd) { 
                return o1.getCity().compareTo(o2.getCity());
            } else { 
                return o2.getCity().compareTo(o1.getCity());
            }
        }
    });
}

知识点总结:

  日期的比较:

      1、获取类中data成员变量

         //通过对象.属性获得data(注意:此时得到的是String类型)

                String d1 = o1.getData();
                String d2 = o2.getData();
                //创建Format对象,用正则表达式进行格式控制
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
 
          Date date1 = format.parse(d1);
                  Date date2 = format.parse(d2);

          //共有两种比较方法,before,after
          return date2.after(date1);//降序
          return date1.befor(date2); //降序
          
           return date2.befor(date1); //升序
           return date1.after(date2);//升序

耐得住寂寞,经得住诱惑。

    

 










以上是关于java基础增强:统计网上app下载情况,并排序的主要内容,如果未能解决你的问题,请参考以下文章

任务':app:transformClassesWithDexBuilderForDebugAndroidTest'的执行失败,java.lang.RuntimeException(代

app应用市场下载统计攻略

算法导论习题—排序最坏情况线性时间选择算法小顺序统计量

jstat命令

Java实现英语文章词频统计

转:Apple的App Analytics统计平台你必须知道的