一. 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字符串与对象间的相互转换,求电影平均分的更多相关文章

  1. 音乐出身的妹纸,零基础学习JAVA靠谱么

    问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...

  2. 总结了零基础学习Java编程语言的几个基础知识要点

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这 ...

  3. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  4. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  5. salesforce lightning零基础学习(十五) 公用组件之 获取表字段的Picklist(多语言)

    此篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) 我们在lightning中在前台会经常碰到获取pi ...

  6. salesforce零基础学习(一百一十三)Trigger中获取IP地址的过程

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.228.0.apexcode.meta/apexcode/apex_class_Auth ...

  7. 零基础学习hadoop到上手工作线路指导(编程篇)

    问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如 ...

  8. [学习线路] 零基础学习hadoop到上手工作线路指导(初级篇)

    about云课程最新课程Cloudera课程   零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了. ...

  9. Salesforce 集成篇零基础学习(一)Connected App

    本篇参考: https://zhuanlan.zhihu.com/p/89020647 https://trailhead.salesforce.com/content/learn/modules/c ...

随机推荐

  1. 修改openstack镜像--支持root密码登陆

    一.前言 从openstack官方下载的云镜像一般都是普通用户密钥登陆,比如centos镜像的普通用户为centos,ubuntu镜像的普通用户为ubuntu,虽然密钥登陆系统相比密码登陆来说比较方便 ...

  2. 【lwip】04-内存管理

    目录 前言 4. 内存管理 4.1 内存分配策略 4.1.1 固定大小的内存块 4.1.2 可变大小分配 4.2 动态内存池(pool) 4.2.1 介绍 4.2.2 内存池的预处理 4.2.3 内存 ...

  3. You (oracle) are not allowed to access to (crontab) because of pam configura

    用oracle用户添加备份计划任务,crontab -e,提示:You (oracle) are not allowed to access to (crontab) because of pam c ...

  4. Go语言核心36讲(Go语言进阶技术十五)--学习笔记

    21 | panic函数.recover函数以及defer语句 (上) 在本篇,我要给你展示 Go 语言的另外一种错误处理方式.不过,严格来说,它处理的不是错误,而是异常,并且是一种在我们意料之外的程 ...

  5. NAT & 防火墙

    NAT 网络地址转换 NAT产生背景 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联 ...

  6. vue脚手架配置代理

    vue.config.js配置具体代理规则 module.exports = { devServer: { proxy: { '/api1': { // 匹配所有以 '/api1'开头的请求路径 ta ...

  7. python编写脚本,登录Github通过指定仓库指定敏感关键字搜索自动化截图生成文件【完美截图】

    前言:为了避免开发人员将敏感信息写入文件传到github,所以测试人员需要检查每个仓库是否有写入,人工搜索审核比较繁琐,所以写一个脚本通过配置 配置文件,指定需要搜索的仓库和每个仓库需要搜索的关键字, ...

  8. 《Python语言程序设计》【第1周】Python基本语法元素

    实例:温度转化 #TempConvert.py 单行注释 ''' TemConvert.py ''' # 多行注释 TempStr = input("请输入带有符号的温度值: ") ...

  9. python地理空间(1)--概念引入

    1 python与地理空间分析 1.1 与我们的生活 ushahidi是一个优秀的地理空间地图应用,回寝FQ看一下. ushahidi有一个python库-ushapy 地理空间救灾建模程序是最近比较 ...

  10. [EntityFramework]记录Linq中如何比较数据库中Timestamp列的方法(如大于0x00000000000007D1的记录)

    Timestamp对于EF实体的类型是byte[] class Program { static void Main(string[] args) { using (var context = new ...