1. 程式人生 > >java基礎增強:統計網上app下載情況,並排序

java基礎增強:統計網上app下載情況,並排序

技術 rri map對象 cat -s height hang city ole

一入編程深似海,從此妹子是路人。

案例:

  統計網站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下載情況,並排序