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