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);//升序
耐得住寂寞,經得住誘惑。
java基礎增強:統計網上app下載情況,並排序