访问量案例"/>
URL区域访问量案例
给定的access.log是电信运营商的用户上网数据,
第一个字段是时间, 第二个字段是ip地址,第三个字段是访问的网站,
其他字段可以忽略不计。
ip.txt是ip地址和归属地的规则数据,里面的数据是根据ip地址的十进制从低到高排序。
要求:
通过计算access.log中的用户行为数据,统计出各个省份访问量(一次请求记作一次独立的访问量),并按照各个省份的访问量的从高到低进行排序
分析 :
- 根据需求,要确定access.log中用户ip地址所在的省份,
- 要确定就要查找,ip.txt中数据保存在list中,第一IpBean存储数据,list方便使用索引查找
- ip.txt中的ip是[16779264,16781311],这是长整型的一个范围,要对access.log里面的ip(192.168.12.14)进行长整型转化,用二分查找找到ip对应的IpBean
- 将找到的省份存在map中,value是访问的次数
main方法:
// key -->省份 value -->ip访问的次数Map<String, Integer> pMap = new HashMap<>();BufferedReader br = new BufferedReader(new FileReader("d:/data/access.log"));String line;while ((line = br.readLine()) != null) {try {// 20090121000132095572000|125.213.100.123|show.51.com|/.....String[] split = line.split("\\|");// 对ip地址分割String[] ip = split[1].split("\\.");// 转长整型ip地址long longIp = (Long.parseLong(ip[0]) << 24) + (Long.parseLong(ip[1]) << 16) + (Long.parseLong(ip[2]) << 8)+ (Long.parseLong(ip[3]));//通过二分查找找到对应ip地址所在的beanIpBean bean = MyUtils.binarySearchByLongIp(longIp);String province = bean.getProvince();Integer count = pMap.getOrDefault(province, 0);count++;pMap.put(province, count);} catch (Exception e) {//异常出现就结束本次循环continue;}}//对pMap按value降序排序,输出到控制台/*** pMap.entrySet().stream->EntrySet<String,Integer>的流* sorted按value降序* foreach 遍历打印*/pMap.entrySet().stream().sorted((o1,o2)->o2.getValue()-o1.getValue()).forEach(System.out::println);br.close();
读IpBean:
public static List<IpBean> getIpInfo() throws Exception {//存IpBeanList<IpBean> list = new ArrayList<>();BufferedReader br = new BufferedReader(new FileReader("d:/data/ip.txt"));String line;while((line = br.readLine())!=null) {// | 分割数据String[] split = line.split("\\|");String startIp=split[0];String endIp=split[1];long startLongIp;long endLongIp;try {//如果split[2]/split[3]的数据不是数字的就会报错,跳过这条数据startLongIp=Long.parseLong(split[2]);endLongIp=Long.parseLong(split[3]);} catch (Exception e) {continue;}String zhou=split[4];String contry=split[5];String province=split[6];String city=split[7];String area=split[8];String isp=split[9];IpBean bean = new IpBean(startIp, endIp, startLongIp, endLongIp, zhou, contry, province, city, area, isp);list.add(bean);}br.close();return list;}
二分查找:
public static IpBean binarySearchByLongIp(long key) throws Exception {//声明两个指针,一个指向开始,一个指向结束int start = 0;int end = info.size() - 1;while (start <= end) {// 得到中间的索引 和 对应的Beanint middleIndex = (start + end) >>> 1;IpBean midBean = info.get(middleIndex);// 得到ip的长整型long startLongIp = midBean.getStartLongIp();long endLongIp = midBean.getEndLongIp();//如果key在ip之间,返回找到的Beanif (key >= startLongIp && key <= endLongIp) {return midBean;//key小于startLongIp的时候,让end指向middleIndex-1;} else if (key < startLongIp) {end = middleIndex - 1;//key大于endLongIP的时候,让start指向middleIndex+1;} else {start = middleIndex + 1;}}//如果没有找到,返回nullreturn null;}
更多推荐
URL区域访问量案例
发布评论