计算出用户上网流量总流量(上行+下行)最高的网站Top3

分析用户访问网站日志,计算出上网总流量前3名的网站名及总流量

日志部分如下(电话号,URL,上行量,下行量)

13026230503 http://v.baidu.com/tv 20 5000
13826544101 http://www.weibo.com/?category=7 20 5000
13926435656 http://v.baidu.com/tv 20 5000
13926251106 https://www.jianshu.com/p/bb88f7520b33 70 3000
18211575961 http://weibo.com/?category=1760 10 100
13560439658 http://www.51doit.cn 10 4000
15920133257 https://www.jianshu.com/p/bb88f7520b9e 20 3000
13719199419 http://movie.youku.com 10 6000
13000117991 http://www.51doit.cn 10 2000

分析过程:
  1. 读取日志文件内容
  2. 处理获取日志中的电话号,URL,上行量,下行量数据
  3. 汇总网站名及流量,继续处理
  4. 得出结果
所需要工具:
  1. 读取文件 IO流: BufferedReader() 缓冲字符流,利用其中 readLine() 方法。
  2. 字符串分割:split() 方法 ,返回 String 数组
  3. HashMap 储存筛选出来数据< key, value>。
    ** key: String类型, 储存网站名
    ** value: Integer类型,储存总流量
  4. lambda表达式,利用List集合中排序功能进行网站总流量排名
具体实现代码如下(已封装成方法)
public static void getData(String path) throws Exception {
        /**读取日志文件*/
        BufferedReader br = new BufferedReader(new FileReader(new File(path)));
        Map<String, Integer> map = new HashMap<String,Integer>();

        String line =null;
        while((line=br.readLine())!=null) {

            /**读取每一行内容,然后进行分割 空格*/

            String[] split = line.split("\\s");
            String phone=split[0];
            String url=split[1];
            Integer upLoad=Integer.parseInt(split[2]);
            Integer downLoad=Integer.parseInt(split[3]);

            /**除去不符合规范的网站*/
            String[] split2 = url.split("\\.");
            if(split2.length>=3) {
            String webSite=split2[1];
            Integer totalStream = map.getOrDefault(webSite, 0);
            totalStream+=upLoad+downLoad;
            map.put(webSite, totalStream);
            }
        }
        /**利用ArrayList构造方法把map.entrySet转成List集合top3*/
        List<Map.Entry<String, Integer>> top3=new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
        List<Entry<String, Integer>> collect = top3.stream().sorted((o1,o2)->o2.getValue()-o1.getValue()).limit(3).collect(Collectors.toList());
        System.out.println("网站总流量(上行+下行)Top3\t\n");
        for (Entry<String, Integer> entry : collect) {
            System.out.println("网站名:"+entry.getKey()+", 总流量:"+entry.getValue());
        }

彩蛋1

流程图
这里写图片描述

/**
当while循环开始, map中无key: baidu, 此时回馈0.返回值Integer类型'
totalStream+=upLoad+downLoad; 此时计算 baidu的总流量
然后map.put("baidu", 5020);
当下次循环, 读取到第二个 baidu时,5020+=upLoad+downLoad.
*/
String webSite=split2[1];
Integer totalStream =map.getOrDefault(webSite, 0);
totalStream+=upLoad+downLoad;
map.put(webSite, totalStream);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有如下数据: | 手机号 | 上行流量 | 下行流量 | | ----------- | -------- | -------- | | 13926251106 | 100MB | 200MB | | 15013685858 | 50MB | 150MB | | 13560439658 | 80MB | 120MB | | 13602846565 | 60MB | 180MB | 可以将每个手机号对应的数据封装成一个对象,再将所有对象序列化成一个字符串,例如使用JSON格式: ```json [ {"phone_number": "13926251106", "uplink_flow": "100MB", "downlink_flow": "200MB"}, {"phone_number": "15013685858", "uplink_flow": "50MB", "downlink_flow": "150MB"}, {"phone_number": "13560439658", "uplink_flow": "80MB", "downlink_flow": "120MB"}, {"phone_number": "13602846565", "uplink_flow": "60MB", "downlink_flow": "180MB"} ] ``` 在计算上行流量下行流量总流量时,可以将JSON数据反序列化为对象数组,对每个对象的上行流量下行流量进行累加,得到总上行流量、总下行流量总流量。例如,使用Python代码实现: ```python import json data = '[{"phone_number": "13926251106", "uplink_flow": "100MB", "downlink_flow": "200MB"},{"phone_number": "15013685858", "uplink_flow": "50MB", "downlink_flow": "150MB"},{"phone_number": "13560439658", "uplink_flow": "80MB", "downlink_flow": "120MB"},{"phone_number": "13602846565", "uplink_flow": "60MB", "downlink_flow": "180MB"}]' objects = json.loads(data) total_uplink = 0 total_downlink = 0 for obj in objects: uplink = int(obj["uplink_flow"].replace("MB", "")) downlink = int(obj["downlink_flow"].replace("MB", "")) total_uplink += uplink total_downlink += downlink total_flow = total_uplink + total_downlink print("总上行流量:{}MB".format(total_uplink)) print("总下行流量:{}MB".format(total_downlink)) print("总流量:{}MB".format(total_flow)) ``` 输结果: ``` 总上行流量:290MB 总下行流量:650MB 总流量:940MB ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值