一. 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. Shadertoy 教程 Part 4 - 绘制多个2D图形和混入

    Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...

  2. 安装配置多个版本JDK

    前言:JDK有多个版本,有时为了开发需要切换不同的版本,在一部电脑上安装多个JDK,只需要按以下配置,每次即可轻松使用.以下环境为Windows10 安装JDK 安装JDK8 配置环境变量 需要配置J ...

  3. IDM使用教程:利用IDM下载百度网盘文件

    IDM是什么 其实我使用IDM下载器只是为了方便网页版百度网盘直接下载大于40M文件而已,大家知道文件过大必须打开客户端才能下载,这点对于我的破电脑感觉很烦躁,每次要等待它慢悠悠打开,然后动用我的超级 ...

  4. 设计模式学习-使用go实现原型模式

    原型模式 定义 代码实现 优点 缺点 适用场景 参考 原型模式 定义 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复 ...

  5. 【死磕 NIO】— Proactor模式是什么?很牛逼吗?

    大家好,我是大明哥. 上篇文章我们分析了高性能 IO模型Reactor模式,了解了什么是Reactor 模式以及它的三种常见的模式,这篇文章,大明再介绍另外一种高性能IO模型: Proactor. 为 ...

  6. git 回滚版本

    方法一.(回滚到原来的版本) 1.在gitlab上找到要恢复的版本号,如: bbdca96 2.在客户端执行如下命令(执行前,先将本地代码切换到对应分支): git reset --hard bbdc ...

  7. python Max retries exceeded with URL in requests

    使用requests进行重试 import requests from requests.adapters import HTTPAdapter from requests.packages.urll ...

  8. 准备 dubbo 学习目录

    1. dubbo 背景及原理2. dubbo 架构分析4. dubbo 设计模式分析5. dubbo 实战使用6. dubbo 优化

  9. 自定义 OpenShift s2i 镜像与模板——OracleJDK8

    本文目标 由于 OpenShift 官方提供的镜像与模板(OpenJDK8)不完全满足业务需要: 不包含飞行记录功能.只有 OpenJDK11 以上才被 Oracle 开源 生成堆 dump 很大很慢 ...

  10. 【Java面试题】-- Java基本类型

    Java基本类型 2019-11-03  19:03:48  by冲冲 1.两个float型相减丢失精度,如何解决? 使用BigDemical装饰器模式 public class Test { pub ...