社交数据分析--共同好友分析(java版)

1 数据

冒号左边为用户id,冒号右边为用户的好友列表

A:B,C,D,F,E,O

B:A,C,E,K

C:F,A,D,I

D:A,E,F,L

E:B,C,D,M,L

F:A,B,C,D,E,O,M

G:A,C,D,E,F

H:A,C,D,E,O

I:A,O

J:B,O

K:A,C,D

L:D,E,F

M:E,F,G

O:A,H,I,J

2 需求

求出有共同好友的用户对,及他们的共同好友,如:

AB,有共同好友C,E

AC,有共同好友D

.......

3 步骤分析

 假如社交数据存储在本地的文件中 

1 读取数据信息
2 对获取的每行数据处理,按照“:”号切分,左侧为用户id,右侧是当前用户对应的好友列表(再按照“,”号切分好友列表)
3 将用户和器对应的好友列表存放在map这种集合类型中,(用户id作为key,其对应的好友列表作为value【list】)
 4 求出任意两个用户的共同好友的交集,求list的交集

4 使用到的技术点

IO读取文件信息,字符串切割,List和map集合存储数据和常用方法

5 代码实现

  一 读取文件数据获取用户和器对应的好友列表 Map<String,List<String>>

public static Map<String, List<String>> getUserInfo() {

Map<String, List<String>> map = new HashMap<>();

try(BufferedReader br = new BufferedReader(new FileReader("d:/data/好友.txt"));//可自动释放资源) {

String line = null;

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

// 切割数据 获取每个用户对应的列表

String[] split = line.split(":");

if (split.length >= 2) {

String str = split[0];// 用户

String str2 = split[1];

String[] fs = str2.split(",");

List<String> list = Arrays.asList(fs);//注意 Arrays.asList(fs)转换的这种集合的长度是固定的不可修改

map.put(str, list);

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return map;

}

}

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

为了实现获取任意两个人的共同好友,所以要对map的key,即所有的用户进行遍历操作,可以将用户的uid再放在list中 ,方便遍历和比较

public static void main(String[] args) throws Exception {

//将共同好友数据写到指定的文件中

BufferedWriter writer = new BufferedWriter(new FileWriter("d:/data/same.txt"));

Map<String, List<String>> info = getUserInfo();

//存储所有的用户信息

List<String> us = new ArrayList<>();

Set<String> uids = info.keySet();

for (String uid : uids) {

us.add(uid);

}

List<String> fs1 = null;

List<String> fs2 = null;

for (int i = 0; i < us.size()-1; i++) {

String uid1 = us.get(i);//前面的一个好友

List<String> f = info.get(uid1);//前面一个人的好友

for (int j = i + 1; j < us.size(); j++) {

String uid2 = us.get(j);//后面的一个人

List<String> ff = info.get(uid2);//后面那个人的好友

fs1 = new ArrayList<>(f);

fs2 = new ArrayList<>(ff);

fs1.retainAll(fs2);

if (fs1 != null && fs1.size() > 0) {

writer.write(uid1 + "" + uid2 + "的共同好友:" + fs1+"\n");

System.out.println(uid1 + "" + uid2 + "的共同好友:" + fs1);

writer.flush();

}

}

}

}


思考

1 获取制定两个用户的共同好友(假如用户数量非常多,加载数据需要很长时间,怎么优化?)

2 获取好友数最多的前N个用户

如有疑问请咨询 qq : 598196583

更多内容请咨询qq:598196583    附带视频资料


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

社交数据分析--共同好友分析(java版)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭