零基础学习java------26--------获取省访问量的top3,APP版本数据分析,事务,json,json字符串与对象间的相互转换,求电影平均分
一. day23中的ip,url案例(前面答案错了)
思路分析:
1.创建javabean,用来存储ip.txt各字段的信息
2. 创建java工具类,封装相应的方法
(1) 加载读取ip.txt文档,获取各字段,将之封装进javabean,并将javabean存储至list中去(ip地址为区间范围,用map满足不了需求),以便后面能通过access.log内的ip找到其在ip.txt所属的javabean
(2)将ip转译为长整型数
(3)利用二分法查找access.log内的ip在ip.txt所属的javabean(返回javabean,即可得到所属的省份)
3. 统计各省的访问量
java工具类以及javabean见day23
public class IpTest {
// 将数据的加载放入静态代码块
static List<IpBean> list = null;
static {
list = IpUtils.loadIpToList();
}
public static void main(String[] args) {
Map<String, Integer> map = readData();
// 排序
Set<Entry<String, Integer>> entrySet = map.entrySet();
ArrayList<Entry<String, Integer>> list = new ArrayList<>(entrySet);
Collections.sort(list, new Comparator<Entry<String, Integer>>(){
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o2.getValue()-o1.getValue();
}
});
for (Entry<String, Integer> entry : list) {
System.out.println(entry);
}
}
public static Map<String, Integer> readData() {
Map<String, Integer> map = new HashMap<>();
// 获取以province为key,访问量为value的map
// Integer sum = 1;
try (
BufferedReader br = new BufferedReader(new FileReader("E:\\javafile\\access.log"));
){
String line = null;
while((line=br.readLine()) != null) {
String[] split = line.split("\\|");
String ip = split[1];
//将ip转译成长整型
Long ip1 = IpUtils.parseStrIpToLongIp(ip);
//利用二分查找获取ip1对应的javabean
IpBean bean = IpUtils.binaryOfIp(ip1, list);
String province = bean.getProvince();
Integer count = map.getOrDefault(province, 0);
map.put(province, ++count);
// if(map.containsKey(province)) { 这种叠加访问量的方式不知道错在哪
// map.put(province, ++sum);
// }else {
// map.put(province, 1);
// }
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
运行结果:
二. APP版本数据分析
1.数据
2. 需求:
统计出每天的app版本升级情况(最小版本,和最大版本),此外日期要按时间升序排列
3. 思路分析
(1)以日期,用户名,app名,新版本下载渠道为key,装有version的Set为value,将数据封装至map
(2)将map的value值排序(升序),可得出每天最早的版本和最后更新的版本
(3)创建AppBean,用来存放上图各字段的值
(4)对AppBean中的时间字段进行排序(升序)-----> 将时间(String)转译成date格式, 使用date1.before(date2)
代码如下
AppBean
public class AppBean {
private String date;
private String userName;
private String appName;
private String store;
private String minVersion;
private String maxVersion; public AppBean() { } public AppBean(String date, String userName, String appName, String store, String minVersion, String maxVersion) {
super();
this.date = date;
this.userName = userName;
this.appName = appName;
this.store = store;
this.minVersion = minVersion;
this.maxVersion = maxVersion;
} public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getAppName() {
return appName;
} public void setAppName(String appName) {
this.appName = appName;
} public String getStore() {
return store;
} public void setStore(String store) {
this.store = store;
} public String getMinVersion() {
return minVersion;
} public void setMinVersion(String minVersion) {
this.minVersion = minVersion;
} public String getMaxVersion() {
return maxVersion;
} public void setMaxVersion(String maxVersion) {
this.maxVersion = maxVersion;
} @Override
public String toString() {
return "AppBean [date=" + date + ", userName=" + userName + ", appName=" + appName + ", store=" + store
+ ", minVersion=" + minVersion + ", maxVersion=" + maxVersion + "]";
}
}
实现类
public class appTest {
public static void main(String[] args) throws Exception {
// 将日期按从小到大的顺序排列
ArrayList<AppBean> list = loadDataToBean();
Collections.sort(list, new Comparator<AppBean>() {
@Override
public int compare(AppBean o1, AppBean o2) {
try {
String str1 = o1.getDate();
String str2 = o2.getDate();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = simpleDateFormat.parse(str1);
Date date2 = simpleDateFormat.parse(str2);
return date1.before(date2) ?-1:1;
} catch (ParseException e) {
e.printStackTrace();
}
return 0; }
});
System.out.println(list);
}
// 将数据封装至AppBean
public static ArrayList<AppBean> loadDataToBean() {
// 获取缓冲字符流,读取并切割数据
Map<String, Set<String>> map = new HashMap<>();
ArrayList<AppBean> arrayList = new ArrayList<>();
try (
BufferedReader br = new BufferedReader(new FileReader("E:/javafile/app.txt"));
){
String line = null;
while((line= br.readLine()) != null) {
String[] split = line.split(",");
String date = split[0];
String userName = split[1];
String appName = split[2];
String store = split[3];
String version = split[5];
// 将数据封装至map
String key = date +","+ userName+","+ appName+","+ store;
Set<String> vs = map.getOrDefault(key, new HashSet<>());
vs.add(version);
map.put(key, vs);
}
//
Set<Entry<String, Set<String>>> entrySet = map.entrySet();
for (Entry<String, Set<String>> entry : entrySet) {
// 对value(set)进行排序
Set<String> set = entry.getValue();
if(set.size()>1) {
ArrayList<String> list = new ArrayList<>(set);
Collections.sort(list, (o1,o2)->o1.compareTo(o2));
//获取list种的第一个和最后一个
String minVersion = list.get(0);
String maxVersion = list.get(list.size()-1);
String key = entry.getKey();
String[] split = key.split(",");
// 向 AppBean 封装数据,并将之存储至List中
AppBean bean = new AppBean(split[0], split[1], split[2], split[3], minVersion, maxVersion);
arrayList.add(bean);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return arrayList;
}
}
三 事务(https://www.cnblogs.com/huanongying/p/7021555.html)
1. 概念
一组逻辑上的操作,在这组逻辑操作中的所有sql语句在执行的过程中要么全部成功,要么全部失败。mysql默认的是一个sql语句一个事务,其会自动提交并执行sql
2. 事务的基本要素(ACID)
(1)原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位
(2)一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没有收到钱
(3)隔离性(Isolation):同一时间,只允许一个事务请求同一事务,不同的事务之间没有任何干扰。比如A正在从一张银行卡中取出钱,在A取钱的过程结束前,B不能向这张转账。
(4)持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚
3. 事务的并发问题
(1)脏读:事务A读取了事务B更新的数据,然后B回滚操作(读取了未提交的数据),那么A读取到的数据是脏数据
(2)不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致
(3)幻读:系统管理员A将数据库中所有学生的成绩从具体的分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫环读
小结:不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
4. Mysql事务隔离级别
四. json
Json是一种数据格式,简单并且容易解析,常用于网络之间数据传输,一个json即为一个对象
Json字符串与json对象之间的相互转换
使用阿里巴巴开发的fastjson工具
数据:
转换代码
public class JsonDemo {
public static void main(String[] args) {
try (
BufferedReader br = new BufferedReader(new FileReader("E:/javafile/move.txt"));
){
String line =null;
while((line = br.readLine()) != null) {
System.out.println(line);
//json字符串---->对象
Movie m = JSON.parseObject(line, Movie.class);
System.out.println(m);
// 对象--->字符串
// String mstr = JSON.toJSONString(m);
// System.out.println(mstr);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
求每个用户对电影评分的平均分
代码
public class AverageRate {
public static void main(String[] args) {
Map<String, Double> avgMap = getAvgMap();
System.out.println(avgMap);
} // 获取以uid为key,平均分数为值的map
public static Map<String,Double> getAvgMap() {
Map<String,List<Double>> map = new HashMap<String,List<Double>>();
Map<String,Double> avgMap = new HashMap<>();
// 获取缓冲字符流读取文件
try (
BufferedReader br = new BufferedReader(new FileReader("E:/javafile/move.txt"));
){
String line = null;
while((line = br.readLine()) != null) {
// 获取以uid为key,装有date的list为值的map
Movie m = JSON.parseObject(line, Movie.class);
String uid = m.getUid();
Double rate = m.getRate();
List<Double> list = map.getOrDefault(uid, new ArrayList<Double>());
list.add(rate);
map.put(uid,list);
}
// 求平均值,并将相应的值封装进avgMap
Set<Entry<String, List<Double>>> entrySet = map.entrySet();
for (Entry<String, List<Double>> entry : entrySet) {
String uid1 = entry.getKey();
List<Double> listValue = entry.getValue();
Double total = (double) 0;
for(int i=0;i<listValue.size();i++){
total += listValue.get(i);
}
Double avg = total/listValue.size();
avgMap.put(uid1,avg);
}
} catch (Exception e) {
e.printStackTrace();
}
return avgMap;
}
}
零基础学习java------26--------获取省访问量的top3,APP版本数据分析,事务,json,json字符串与对象间的相互转换,求电影平均分的更多相关文章
- 音乐出身的妹纸,零基础学习JAVA靠谱么
问:表示音乐出身的妹纸一枚 某一天突然觉得身边认识的是一群程序员 突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...
- 总结了零基础学习Java编程语言的几个基础知识要点
很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面 初学者先弄清这 ...
- salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值
注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
- salesforce lightning零基础学习(十五) 公用组件之 获取表字段的Picklist(多语言)
此篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) 我们在lightning中在前台会经常碰到获取pi ...
- salesforce零基础学习(一百一十三)Trigger中获取IP地址的过程
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.228.0.apexcode.meta/apexcode/apex_class_Auth ...
- 零基础学习hadoop到上手工作线路指导(编程篇)
问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如 ...
- [学习线路] 零基础学习hadoop到上手工作线路指导(初级篇)
about云课程最新课程Cloudera课程 零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了. ...
- Salesforce 集成篇零基础学习(一)Connected App
本篇参考: https://zhuanlan.zhihu.com/p/89020647 https://trailhead.salesforce.com/content/learn/modules/c ...
随机推荐
- 树行DP小结
顾名思义:就是在树上做的DP,依据DFS的性质,在访问过儿子之后返回后将儿子的状态传递给父亲... 先看例题: 此题用贪心也能过,不过正解是DP. 对于树上的DP我们可以直接考虑最优解下各点的状态来方 ...
- hdu 5101 Select (二分+单调)
题意: 多多有一个智商值K. 有n个班级,第i个班级有mi个人.智商分别是v1,v2,.....vm. 多多要从这些人中选出两人.要求两人智商和大于K,并且两人不同班.问总共有多少种方案. 数据范围: ...
- 输入指令npx webpack-dev-server报错:Error: Cannot find module ‘webpack-cli/bin/config-yargs‘的解决方法
输入指令npx webpack-dev-server报错:Error: Cannot find module 'webpack-cli/bin/config-yargs'的解决方法 输入指令:npx ...
- PCB各层介绍
在PCB设计中用得比较多的图层: mechanical 机械层 keepout layer 禁止布线层 Signal layer 信号层 Internal plane layer 内部电源/接地层 t ...
- Mysql - 如何存储 10位、13位的 unix 时间戳?
背景 前面有讲过存日期时间可以用 datetime.timestamp 类型:https://www.cnblogs.com/poloyy/p/15546735.html 格式是: YYYY-MM- ...
- 编解码再进化:Ali266 与下一代视频技术
过去的一年见证了人类百年不遇的大事记,也见证了多种视频应用的厚积薄发.而因此所带来的视频数据量的爆发式增长更加加剧了对高效编解码这样的底层硬核技术的急迫需求. 新视频编解码标准 VVC 定稿不久之后, ...
- ajax的post请求获取kfc官网数据
# _*_ coding : utf-8 _*_# @Time : 2021/11/2 13:45# @Author : 秋泊酱 # 1页 # http://www.kfc.com.cn/kfccda ...
- 菜鸡的Java笔记 第三十二 - java 静态导入的实现
静态导入的实现 为了理解静态导入的操作产生的动机,下面通过一个具体的代码来观察 范例:现在有一个 Import 的类,这个类中的方法全部都是 static 方法 packa ...
- 【linux系统】命令学习(四)统计命令
sort 排序 -b 忽略开头的空白符 -f 将小写字母看做为大写字母 -h 根据存储容量排序(kb mb hb )从小到大 -n 按数字排序 -o 把结果写入文件 -r 以相反的顺序来排序 -t 指 ...
- java开发环境搭建,配置
java开发环境搭建 下载jdk8的地址 是oracle的 安装JDK 下载电脑对应的版本 双击安装JDK 记住安装路径 配置环境变量 我的电脑/此电脑 右键属性 高级设置 环境变量 点击新建 变量名 ...