数据分析案例1 QQ好友关系分析

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.。。。
涛哥:杨哥,远哥,帅帅,叮叮,星哥,小鹏鹏,娜姐
杨哥:涛哥,远哥,星哥,辉哥,杨哥
远哥:叮叮,涛哥,帅帅,行哥
帅帅:涛哥,星哥,叮叮,侃哥
星哥:杨哥,远哥,帅帅,凯哥,侃哥
叮叮:涛哥,杨哥,远哥,帅帅,星哥,小鹏鹏,凯哥
马哥:涛哥,远哥,帅帅,星哥,叮叮
娜姐:涛哥,远哥,帅帅,星哥,小鹏鹏
行哥:涛哥,小鹏鹏
马大姐:杨哥,小鹏鹏
辉哥:涛哥,远哥,帅帅
侃哥:帅帅,星哥,叮叮
凯哥:星哥,叮叮,马哥
小鹏鹏:涛哥,娜姐,行哥,马大姐

国家:涛哥

实现代码

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 + "]";
	}
	
}




猜你喜欢

转载自blog.csdn.net/a331685690/article/details/80170640