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、根据map的key获取其对应的版本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);//升序

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

    

原文地址:https://www.cnblogs.com/zdl9857/p/9534265.html

时间: 2024-07-30 01:42:11

java基础增强:统计网上app下载情况,并排序的相关文章

javaweb &gt;_&lt; java基础增强 ①

javaweb_Ⅰjava基础增强——断点 ps:Bad version number   in .class file.             该错误 指eclipse运行环境低于编辑java版本. 双击左键设置断点, F5跳入方法中.step into F6跳过.step over F7跳出方法  .step return 查看变量值:右键watch. 跳到当前方法的最开始.drop to frame 跳到下一个断点 /结束应用程序. resume 清除断点breakpoint. 断点调试

JAVAWEB &gt;_&lt; JAVA基础增强 ②

javaweb_Ⅵjava基础增强——反射 学习框架的基础 反射:加载类,并解剖出类的各个组成部分. 加载类: ps: 获取下列有什么用 构造函数:原,创建对象完成对象初始化.用来创建对象 方法:原,完成某个功能.使用该方法 成员变量:原,封装数据.给字段封装数据 ①反射构造方法 // 解剖(反射类)构造函数并创建类的对象 @Test public void testss () throws Exception { // 先加载类,后解剖(反射) // public Person() Class

JAVA基础篇—文件上传下载

/index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&qu

Java基础增强-反射机制

1 反射机制简介 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法.这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制.反射被视为动态语言的关键. 反射这一概念最早由编程开发人员Smith在1982年提出,主要指应用程序访问.检测.修改自身状态与行为的能力.这一概念的提出立刻吸引了编程界的极大关注,各种研究工作随之展开,随之而来引发编程革

java基础增强

Eclipse使用: java Compile配置的是java编译环境 java Build path配置的是java运行环境 运行环境的版本必须高于编译环境的版本.否则报错 工程上 右键--properties--java build path--Library 移除不需要的版本,选择Add Library,即可选择运行环境. Eclipse断点调试 .以后查看. F5:step into F6:step over F7:step return drop to frame :跳到当前方法的第一

Java基础——增强for循环

java1.5版本引入了一个增强for循环,基本原理和for循环类似. 语法声明:for(表达式:条件表达式) 举例:for (String str : set) 解释:set代表set集合,str代表set集合中存放的类型. 代码示例如下: Set<String> set = new HashSet<String>(); Iterator<String> it = set.iterator(); while (it.hasNext()) { String str =

Java基础增强:集合的嵌套案例

一入编程深似海,从此妹子是路人. List集合的遍历方式: List list = new ArrayList(); //第一种遍历方式 System.out.println(list); //第二种遍历方式,最常用的一种foreach LinkedList<Integer> list = new LinkedList<Integer>(); for (Integer integer : list) { System.out.println(integer); } Map集合的遍历

java基础增强:网络编程、Tcp、Udp案例

一入编程深似海,从此妹子是路人. 1.Udp的客户端,服务端-----DatagramSocket 通过Udp协议编写一个群聊室,具体实现代码如下: package day.by.day.udp.charroom; //客户端代码 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import j

Java基础集锦——利用Collections.sort方法对list排序

要想对List进行排序,可以让实体对象实现Comparable接口,重写compareTo方法即可实现按某一属性排序,但是这种写法很单一,只能按照固定的一个属性排序,没变法变化.通过下面这种方法,可以动态的指定List按照某一个属性进行排序,例子很简单,看代码就明白了. import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; publ