数据:
日期,用户名,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]
}