1.社交用户关系分析
数据样例:
冒号左边为用户id,冒号右边为用户的好友列表
需求1:各个用户(user)的好友数量 涛哥:7 杨哥:5
步骤:1):使用io流读取数据
2):对每一行数据进行切分
1;使用:分割 ---> 用户 好友列表(String)
2;好友列表再进行一个分割(,)
3)求好友的数量
4)按照好友的数量进行排序
//已完成
需求2:两两之间的共同好友
涛哥和杨哥的共同好友有:远哥,星哥
涛哥和远哥的共同好友有:。。。。。。
1:读取数据
2:数据的切分
1):通过冒号进行分割 用户 好友列表
2):进行好友列表进行分割 ---> 一个个的好友
3:数据装载到map集合中
4:获取好友列表(两两用户进行求共同好友的)
5:求两两的用户的共同好友
6:输出结果(把结果保存到文件中)
userId:好友1,好友2.。。。
涛哥:杨哥,远哥,帅帅,叮叮,星哥,小鹏鹏,娜姐
杨哥:涛哥,远哥,星哥,辉哥,杨哥
远哥:叮叮,涛哥,帅帅,行哥
帅帅:涛哥,星哥,叮叮,侃哥
星哥:杨哥,远哥,帅帅,凯哥,侃哥
叮叮:涛哥,杨哥,远哥,帅帅,星哥,小鹏鹏,凯哥
马哥:涛哥,远哥,帅帅,星哥,叮叮
娜姐:涛哥,远哥,帅帅,星哥,小鹏鹏
行哥:涛哥,小鹏鹏
马大姐:杨哥,小鹏鹏
辉哥:涛哥,远哥,帅帅
侃哥:帅帅,星哥,叮叮
凯哥:星哥,叮叮,马哥
小鹏鹏:涛哥,娜姐,行哥,马大姐
4 MainTest2
数据样例:
冒号左边为用户id,冒号右边为用户的好友列表
需求1:各个用户(user)的好友数量 涛哥:7 杨哥:5
步骤:1):使用io流读取数据
2):对每一行数据进行切分
1;使用:分割 ---> 用户 好友列表(String)
2;好友列表再进行一个分割(,)
3)求好友的数量
4)按照好友的数量进行排序
//已完成
需求2:两两之间的共同好友
涛哥和杨哥的共同好友有:远哥,星哥
涛哥和远哥的共同好友有:。。。。。。
1:读取数据
2:数据的切分
1):通过冒号进行分割 用户 好友列表
2):进行好友列表进行分割 ---> 一个个的好友
3:数据装载到map集合中
4:获取好友列表(两两用户进行求共同好友的)
5:求两两的用户的共同好友
6:输出结果(把结果保存到文件中)
userId:好友1,好友2.。。。
涛哥:杨哥,远哥,帅帅,叮叮,星哥,小鹏鹏,娜姐
杨哥:涛哥,远哥,星哥,辉哥,杨哥
远哥:叮叮,涛哥,帅帅,行哥
帅帅:涛哥,星哥,叮叮,侃哥
星哥:杨哥,远哥,帅帅,凯哥,侃哥
叮叮:涛哥,杨哥,远哥,帅帅,星哥,小鹏鹏,凯哥
马哥:涛哥,远哥,帅帅,星哥,叮叮
娜姐:涛哥,远哥,帅帅,星哥,小鹏鹏
行哥:涛哥,小鹏鹏
马大姐:杨哥,小鹏鹏
辉哥:涛哥,远哥,帅帅
侃哥:帅帅,星哥,叮叮
凯哥:星哥,叮叮,马哥
小鹏鹏:涛哥,娜姐,行哥,马大姐
国家:涛哥
实现代码
1 好友.txt
涛哥:杨哥,远哥,帅帅,叮叮,星哥,小鹏鹏,娜姐 杨哥:涛哥,远哥,星哥,辉哥,杨哥 远哥:叮叮,涛哥,帅帅,行哥 帅帅:涛哥,星哥,叮叮,侃哥 星哥:杨哥,远哥,帅帅,凯哥,侃哥 叮叮:涛哥,杨哥,远哥,帅帅,星哥,小鹏鹏,凯哥 马哥:涛哥,远哥,帅帅,星哥,叮叮 娜姐:涛哥,远哥,帅帅,星哥,小鹏鹏 行哥:涛哥,小鹏鹏 马大姐:杨哥,小鹏鹏 辉哥:涛哥,远哥,帅帅 侃哥:帅帅,星哥,叮叮 凯哥:星哥,叮叮,马哥 小鹏鹏:涛哥,娜姐,行哥,马大姐 国家:涛哥
FileToArrayList.java
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class FileToArrayList { public static void main(String[] args) throws IOException { // 从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合 String srcPath = "D:\\新建文件夹 (18)\\案例1\\src\\ch01\\好友.txt"; List<String> list = fileToArrayList(srcPath); for (String s : list) { System.out.println(s); } InputStream is =null; is = new FileInputStream("D:\\新建文件夹 (18)\\案例1\\src\\ch01\\好友.txt"); InputStreamReader isr = new InputStreamReader(is,"utf-8"); BufferedReader bfReader = new BufferedReader(isr); String line = null; line = bfReader.readLine(); while(line!=null){ String[] user = line.split(":"); } } /** * 从指定文件中读取内容到集合中 * @param srcPath * @return */ private static List<String> fileToArrayList(String srcPath) { List<String> list = new ArrayList<String>(); try (BufferedReader br = new BufferedReader(new FileReader(srcPath));) { String line;// 用于保存每次读取的行内容 while ((line = br.readLine()) != null) { list.add(line); } return list; } catch (Exception e) { e.printStackTrace(); return null; } } }3 MainTest
import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * 1.使用IO流读取数据(bufferedReader),每一行数据就读过来了 * 2.使用字符串的分割 (1)使用冒号分割,用户名,好友列表 * (2)好友列表进行分割,一个个的好友 Map<用户和好友列表> Map<用户名和长度> 转化为list 排序 * 3.求取用户对应的好友数量(后面的长度) * 4.根据数量进行排序 */ public class MainTest { public static void main(String[] args) { Map<String, List<String>> map = getUserInfo(); HashMap<String, Integer> map2 = new HashMap<>(); Set<Entry<String,List<String>>> entrySet = map.entrySet(); for(Entry<String, List<String>> entry : entrySet){ map2.put(entry.getKey(),entry.getValue().size()); } //System.out.println(map2); List<UserNameCount> list=new ArrayList<>(); for(Entry<String,Integer> entry : map2.entrySet()){ UserNameCount user = new UserNameCount(); user.setUserName(entry.getKey()); user.setCount(entry.getValue()); list.add(user); } //排序 Collections.sort( list, new Comparator<UserNameCount>(){ @Override public int compare(UserNameCount o2, UserNameCount o1) { return o1.getCount()-o2.getCount(); } }); for(UserNameCount s : list){ System.out.println("用户名:"+s.getUserName()+" "+"好友数量:"+s.getCount()); } } public static Map<String,List<String>> getUserInfo() { Map<String,List<String>> map = new HashMap<>(); try (BufferedReader br = new BufferedReader(new FileReader("D:\\好友.txt"));) { String line = null; while ((line = br.readLine()) != null) { //System.out.println(line); //使用字符串分割,保存到数组中 String[] split = line.split(":"); String username = split[0]; String[] fs = line.split(","); //System.out.println(Arrays.toString(fs)); //Array.asList 不能进行增加或者删除操作 map.put(username, Arrays.asList(fs)); } } catch (Exception e) { e.printStackTrace(); } return map; } }
4 MainTest2
import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * 1.使用IO流读取数据(bufferedReader),每一行数据就读过来了 2.使用字符串的分割 (1)使用冒号分割,用户名,好友列表 * (2)好友列表进行分割,一个个的好友 Map<用户和好友列表> Map<用户名和长度> 转化为list 排序 3.求取用户对应的好友数量(后面的长度) * 4.根据数量进行排序 代码优化 */ public class MainTest2 { public static void main(String[] args) { Map<String, List<String>> map = getUserInfo(); HashMap<String, Integer> map2 = new HashMap<>(); Set<Entry<String, List<String>>> entrySet = map.entrySet(); for (Entry<String, List<String>> entry : entrySet) { map2.put(entry.getKey(), entry.getValue().size()); } // System.out.println(map2); // 直接用泛型统一个格式,放到set集合中,直接输出key和value即可, Set<Entry<String, Integer>> entrySet2 = map2.entrySet(); ArrayList<Entry<String, Integer>> list = new ArrayList<>(entrySet2); Collections.sort(list, new Comparator<Entry<String, Integer>>() { @Override public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { return o1.getValue() - o2.getValue(); } }); for (Entry<String, Integer> s : list) { System.out.println(s); } } public static Map<String, List<String>> getUserInfo() { Map<String, List<String>> map = new HashMap<>(); try (BufferedReader br = new BufferedReader(new FileReader("D:\\好友.txt"));) { String line = null; while ((line = br.readLine()) != null) { // System.out.println(line); // 使用字符串分割,保存到数组中 String[] split = line.split(":"); String username = split[0]; String[] fs = line.split(","); // System.out.println(Arrays.toString(fs)); // Array.asList 不能进行增加或者删除操作 map.put(username, new ArrayList<>(Arrays.asList(fs))); //map.put(username, Arrays.asList(fs)); } } catch (Exception e) { e.printStackTrace(); } return map; } }
5.MainTest3
import java.util.List; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.FileWriter; import java.util.ArrayList; import java.util.Map; import java.util.Set; public class MainTest3 { public static void main(String[] args) throws Exception { BufferedWriter bf = new BufferedWriter(new FileWriter("D:\\lijian.txt")); // 拿到好友列表 Map<String, List<String>> userInfo = MainTest2.getUserInfo(); // 拿到用户列表 Set<String> userSet = userInfo.keySet(); // 存到list中 ArrayList<String> userList = new ArrayList<>(userSet); // 打印list长度 // System.out.println(userList.size()); // 循环比较,类似于冒泡 String user1 = null; String user2 = null; List<String> list3 = null; for (int i = 0; i < userList.size() - 1; i++) {// 控制次数 // 获取第一个用户 user1 = userList.get(i); List<String> list1 = userInfo.get(user1); for (int j = i + 1; j < userList.size(); j++) { // 获取第二个用户 user2 = userList.get(j); // 作为引用,不能在原始数据上操作 List<String> list2 = userInfo.get(user2); // 必须在原始数据上操作 list3 = new ArrayList(list2); // 取交集 list3.retainAll(list1); if (list3 != null && list3.size() > 0) { // 可以根据需要的数据进行拼接 System.out.println(user1 + " 与" + user2 + " 的共同好友 " + list3); String str = user1 + " 与" + user2 + " 的共同好友 " + list3; // 保存到文件 try { bf.write(str); bf.newLine(); bf.flush(); } catch (Exception e) { e.printStackTrace(); } } } } bf.close(); } }
6.
import java.util.ArrayList; import java.util.List; import java.util.Map; public class TestComFs { public static void main(String[] args) { ComFs(); } private static void ComFs() { Map<String,List<String>> userInfo = MainTest2.getUserInfo(); String name1 = "涛哥"; String name2 = "远哥"; //获取用户1的好友列表 List<String> list1 = userInfo.get(name1); List<String> list2 = userInfo.get(name2); ArrayList<String> arraylist = new ArrayList<String>(list1); arraylist.retainAll(list2); System.out.println(arraylist); } }
7.
public class UserBean { MainTest3 user1 = new MainTest3(); MainTest3 user2 = new MainTest3(); MainTest3 list3 = new MainTest3(); }
8.
public class UserNameCount { private String userName; private Integer count; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } @Override public String toString() { return "UserNameCount [userName=" + userName + ", count=" + count + "]"; } }