零基础学习java------22----------社交用户分析案例,反射(概念,获取配置文件的3种方式)

1. 社交用户关系数据分析案例

数据样例:

需求:

  1. 获取每个人的好友个数,并按照好友数量排序

  2. 获取任意两个人的共同好友

  3.获取所有人两两共同好友

1.

public class SimpleFriendsDemo1 {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        try (
                // 获取缓冲字符流,读取并切割数据
                BufferedReader br = new BufferedReader(new FileReader("E:\\javafile\\simpleFriend.txt"));
                ){
            String line = null;
            while((line = br.readLine())!= null) {
                String[] split = line.split(":");
                String uid = split[0];
                String[] fsn = split[1].split(",");
                // 以uid为key,好友数量为value存入map
                map.put(uid,fsn.length);
            }
            // 获取每个人的好友数量
            Set<Entry<String, Integer>> entrySet = map.entrySet();
            for (Entry<String, Integer> entry : entrySet) {
                System.out.println(entry.getKey()+"好友的个数为"+entry.getValue());
            }
            // 安好友数量进行排序(降序)
            ArrayList<Entry<String, Integer>> list = new ArrayList<>(entrySet);
            Collections.sort(list,(o1,o2)->o2.getValue()-o1.getValue());
            System.out.println(list); // [F=7, A=6, E=5, G=5, H=5, B=4, C=4, D=4, O=4, K=3, L=3, M=3, I=2, J=2]
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

2.

错误代码:

public class SimpleFriendsDemo2 {
    public static void main(String[] args) {
        try (
                // 获取缓冲字符流,读取并切割数据
                BufferedReader br = new BufferedReader(new FileReader("E:\\javafile\\simpleFriend.txt"));
                ){
            String line1 = br.readLine();
            String line2 = br.readLine();
            String uid1 = line1.split(":")[0];
            String[] fs1 = line1.split(":")[1].split(",");
            String uid2 = line2.split(":")[0];
            String[] fs2 = line2.split(":")[1].split(",");
            List<String> list1 = Arrays.asList(fs1);
            List<String> list2 = Arrays.asList(fs2);
            list1.retainAll(list2);
            System.out.println(uid1+"和"+uid2+"的共同好友是:"+list1);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:

原因:由asList得到的集合是不能进行增删操作的,即数据不能更改,而retainAll方法对list1中的元素是进行了操作的,所以此处要创建一个新的集合将list1中的数据传进去,正确代码如下

public class SimpleFriendsDemo2 {
    public static void main(String[] args) {
        try (
                // 获取缓冲字符流,读取并切割数据
                BufferedReader br = new BufferedReader(new FileReader("E:\\javafile\\simpleFriend.txt"));
                ){
            String line1 = br.readLine();
            String line2 = br.readLine();
            String uid1 = line1.split(":")[0];
            String[] fs1 = line1.split(":")[1].split(",");
            String uid2 = line2.split(":")[0];
            String[] fs2 = line2.split(":")[1].split(",");
            List<String> list1 = Arrays.asList(fs1);
            List<String> list2 = Arrays.asList(fs2);
            List<String> list11 = new ArrayList<>(list1);
            list11.retainAll(list2);
            if(list11 != null && list11.size()>0) {
                System.out.println(uid1+"和"+uid2+"的共同好友是:"+list11); //A和B的共同好友是:[C, E]
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

方法封装形式的代码

/**
 * 获取两个人的共同好友 数据 文件
 * 获取 Map<String,List<String>>
 * 方法的封装 获取一个数据 传递 返回数据 void
 * @author hang
 */
public class TestDemo2 {
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        //Map<String, List<String>> map = getUserFsInfo();
        getSameFriends("A", "B");
    }
    /**
     * 获取任意两个人的共同好友
     * @param uid1   好友1 id
     * @param uid2  好友2 id
     * @return     返回这两个人的好友列表数据
     */
    public static List<String> getSameFriends(String uid1 , String uid2){
        //map   获取map
        Map<String, List<String>> map = getUserFsInfo();
        // 分别获取两个人的好友列表信息
        List<String> list1 = map.get(uid1);
        List<String> list2 = map.get(uid2);
        //获取两个人的共同好友  将两个集合的共同数据存储在前面集合中
         list1.retainAll(list2);
         //如果两个人的好友存在交集  返回
         if(list1!=null && list1.size()>0){ // 说明有数据     两个好友有交集
             System.out.println(uid1 +"和" + uid2 +"的共同好友是"+list1);
                return list1;
         }
        return null;
    }
    /**
     * 获取存储用户以及用户好友列表的map数据
     * @return
     */
    private static Map<String, List<String>> getUserFsInfo() {
        Map<String, List<String>> map = new HashMap<>();
        try (BufferedReader bfr = new BufferedReader(new FileReader("d:/data/好友.txt"));) {
            String line = null;
            while ((line = bfr.readLine()) != null) {
                String[] split = line.split(":");
                String uid = split[0];
                String fsstr = split[1];
                String[] arr = fsstr.split(",");
                // 将数组 长度 list长度固定  元素不允许修改
                List<String> list = Arrays.asList(arr);
                // 创建新的list存储数据
                ArrayList<String> fsList = new ArrayList<>(list);
                //强每个人对应的好友列表存储在map集合中
                map.put(uid, fsList);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //调用方法返回  一个存储每个人和其对应的每个人的好友列表的map集合
        return map;
    }
}

3.

public class TestDemo3 {
    public static void main(String[] args) {
        //每个人所对应的好友列表
        Map<String, List<String>> map = getUserFsInfo();
        //获取所有的用户uid
        List<String> list = getAllUsers();
        //嵌套循环 获取前一个和后一个人的用户uid
        for (int i = 0; i < list.size() - 1; i++) { // 第一个遍历到倒数第二个
            String uid1 = list.get(i);// A
            List<String> fs1 = map.get(uid1);
            for (int j = i + 1; j < list.size(); j++) { // 从第二个遍历到最后同一个
                String uid2 = list.get(j); // B c d e f
                List<String> fs2 = map.get(uid2);
                //由于 交集的方法会对源集合的数据发生改变  所以要创建新的集合
                List<String> fs = new ArrayList<>(fs2);
                // 交集
                fs.retainAll(fs1);
                if (fs != null && fs.size() > 0) {
                    System.out.println(uid1 + "和" + uid2 + "的好友是" + fs);
                }
            }
        }
        // list遍历方式1
        /*
         * for (String string : list) { System.out.println(string); List<String>
         * fs = map.get(string); }
         */
    }
    /**
     * 获取所有的用户列表
     *
     * @return
     */
    private static List<String> getAllUsers() {
        //创建list集合存储所欲的用户的uid
        List<String> list = new ArrayList<>();
        // 读取数据 将 uid 放在list中
        try (BufferedReader bfr = new BufferedReader(new FileReader("d:/data/好友.txt"));) {
            String line = null;
            while ((line = bfr.readLine()) != null) {
                String[] split = line.split(":");
                String uid = split[0];
                //将所有的用户存储在list集合中
                list.add(uid);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
        return list;
    }
    /**
     * 获取存储用户以及用户好友列表的map数据
     *
     * @return
     */
    private static Map<String, List<String>> getUserFsInfo() {
        Map<String, List<String>> map = new HashMap<>();
        try (BufferedReader bfr = new BufferedReader(new FileReader("d:/data/好友.txt"));) {
            String line = null;
            while ((line = bfr.readLine()) != null) {
                String[] split = line.split(":");
                String uid = split[0];
                String fsstr = split[1];
                String[] arr = fsstr.split(",");
                // 将数组 长度 list长度固定 元素不允许修改
                List<String> list = Arrays.asList(arr);
                // 创建新的list存储数据
                ArrayList<String> fsList = new ArrayList<>(list);
                // 强每个人对应的好友列表存储在map集合中
                map.put(uid, fsList);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 调用方法返回 一个存储每个人和其对应的每个人的好友列表的map集合
        return map;
    }
}

2. 反射(此处结合day20的内容一起看

2.1 一些概念  

反射是一种动态获取类信息的技术,可以根据类的全类型,类的字节码,class属性获取所有字节码的Class类,在java的高级编程和javaee框架中应用广泛

获取到字节码对象以后,可以获取类的任意内容,可以操作类中的任意方法、属性和构造方法等等

对于动态获取类信息的理解:此处的动态体现在使用字符串获取对象(全类名的形式),字符串可以从文件里读取,那么修改文件内容字符串会变化,跟着对象也就变化了

Class类是一个解析.class文件的工具类,类似于IO类可以读取内容。Class类解析了字节码文件就能知道里面的所有内容了,就可以依此为基础创建对应字节码的java对象了

2.2 读取项目配置文件的三种方式

(1). 使用本项目的类获取类加载器

Properties p = new Properties();
p.load(ReadProperties.class.getClassLoader().getResourceAsStream("bean.properties"));

(2). 获取配置文件的输入流

Properties p = new Properties();
p.load(new FileInputStream(new File("conf/bean.properties")));

(3). 使用ResourceBundle类

ResourceBundle b = ResourceBundle.getBundle("bean");
String name = b.getString("className");

3. 日志流量案例

  在给的http.log日志文件中,是电信运营商记录用户上网访问某些网站行为的日志记录数据,一条数据中有多个字段用空格分隔。例如:"18611132889 http://v.baidu.com/tv 20 5000"是一条上网行为,第一个字段代表手机号码,第二个字段代表请求网站的URL,第三个字段代表请求发送的数据即上行流量(20字节),第四个字段代表服务器响应给用户的流量即下行流量(5000字节)。

部分数据截图:

需求:

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

(2)根据个的手机号段归属地规则,计算出总流量最高的省份Top3

(3)根据给的手机号段运营商规则,计算出总流量最高的运营商Top3

原文地址:https://www.cnblogs.com/jj1106/p/11479949.html

时间: 2024-10-09 16:44:20

零基础学习java------22----------社交用户分析案例,反射(概念,获取配置文件的3种方式)的相关文章

五本书籍助你从零基础学习java编程到精通之路

前天的文章给大家介绍了Java初学者应该学习哪些基础,亦是美网络小编从Java的三个大方向:J2SE.J2EE.J2ME对大家做了前景分析,这两天也收到了大家的很多反馈,很多小伙伴看了后对自己的Java编程方向有了比较明确的目标,也有小伙伴们说,要是能提供一些Java初学者应看的书籍就更好了,其实推荐Java书籍已经被规划在小编写的Java编程系列文章之中,常言道:书中自有黄金屋,书中自有颜如玉,下面亦是美网络小编给大家推荐的Java书籍中虽然没有黄金屋和颜如玉,但却能让Java编程的初学者快速

JAVA学习_零基础学习JAVA方法_零基础学习JAVA思路

在学习JAVA前,对于一个真正初学者(也就是从零开始学习JAVA人员)的一个问题:什么是JAVA,然后才是怎么学习JAVA?JAVA是sun microsystems在1995年推出的高级编程语言,其分为Java SE.Java EE.Java ME三大体系,而JAVA SE是JAVA的基础,继JAVASE之后是JAVAEE,JAVA ME.JAVASE是JAVAEE的基础,Servlet.JSP是框架的基础.数据库方面个人建议学习oracle,当然其它的像 MySQL,MSSQL,都可以,只要

零基础学习java:变 量(一)

一.变量的概念: (1)内存中的一个存储区域 (2)该区域有自己的名称(变量名)和类型(数据类型) (3)Java中每个变量必须先声明,后使用 (4)该区域的数据可以在同一类型范围内不断变化 使用变量注意: (1)变量的作用域:一对{ }之间有效 (2)初始化值 定义变量的格式:数据类型    变量名  =  初始化值 二.变量的分类--按数据类型 对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间. 1.整数类型:byte.short.int.long Java各整数类

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

问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Java去..这是不是一条不归路 ... 答:初级应用编程没什么难的 , 只要数学方面不是特别渣, 思维逻辑不混乱,基本上是可行的, 至于其他的 ,没什么可考虑的 , 听得再多,不如向写一波程序 . 你的担忧不无道理,人最怕的就是失去热情.老师的发展空间小且多数属于事业单位 ,在选择和个人成长性上可能较

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

很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这些Java的基本概念也是必不可少的,死记硬背肯定是不行的,重在理解,理解它们之间的区别与联系,分别有哪些应用.想想这些代码中用到了哪些知识点.不要一味地照着书本敲代码.而不去理解. 1.Java编程语言,即语法. 2.Java文件格式,即各种文件夹.文件的后缀. 3.Java虚拟机(JVM),即处理

【JAVA学习笔记】-零基础学习JAVA人分享自己的心得(转)

进入毕业季,毕业设计早早的做完,不想那么早进入职场,便趁此大好时光,一边接受企业培训,一遍自学JAVA.在我看来,学习一门语言必备的几个要点在于,看,练,悟.在这个连技术也已经沦为快餐的时代,很多人无可厚非的认为,在短时间内,快速应用一门语言才是他们所追求的,这也造成了当今培训机构的泛滥.我对此不评价,存在既是合理.但是,我这些心得体会,是想对那些真正喜欢技术的朋友,动机纯粹的朋友而言的,那些不喜欢的人,尽管拍砖,嘿嘿. 学习技术的时候,你是否总会被一些琐事烦恼呢,qq,网游,小说... 我并不

零基础学习java,最新版学习路线图了解一下

目前Java在许多行业的客户端方面的应用非常多,比如OA.邮箱.投票.金融.考试.物流.医疗.矿山等信息方面的系统.Java开发者在这方面的需求也非常大,待遇也相当不错,工资水平可能和Java互联网方向的差不多,但福利和前途则非常好,因为这类工作基本上是政府事业单位及大型企业提供的. 对于java学习,一套专业系统的java学习路线图是不可少的,让你从入门到精通实现系统化! 第一阶段:Java基础 第一部分Java开发介绍 DOS常用命令 JVM.JRE.JDK之间的关系 Java开发环境的搭建

零基础学习Java技术规划

Java编程是一个技术活,没有专业知识,那是行不通的.这也决定了程序员的不可替代性,不是你随便招一个人就可以立马开工. 很多人在转行跨界去接触一个自己从来不懂的行业时往往内心充满了恐惧,也许会高估了这个行业的难度,当然Java编程行业的难度还是有的,不是谁都能随随便便成功. 作为一个零基础的小白,我们该如何高效率的学习Java技术呢?我们老师给我们提出了以下三点: ? 第一:目标明确 因为是转行过来的,明确目标很重要.比如我们已经选定了要学习Java,就要一鼓作气,不能做墙头草,随风倒,看到网上

如何零基础学习java?前辈吐血整理

入门:零基础需要看书看书看书! 推荐一本轻松搞笑,语言直白,通俗易懂的书:<Head First Java> 看一下第一页: 另外两本:<Thinking in Java> ,< Java 核心技术> 这两本是基于看过第一本的基础上的,适合初学者. 看视频:书是静的,视频是动态的,要看代码的动态输入并输出结果的那种.如果只是按照PPT将课程,那就果断放弃. 但有一点书比视频好,那就是知识的重复查阅型,这点谁都比不了,所以案头多放几本书,有需要的时候翻查一下,效率会提高很