需求:
求出有共同好友的用户对及他们的共同好友,如:
1 获取所有用户对应的好友数量 取人缘最好的用户
2 获取制定两个用户的共同好友
3 获取所有人的好友信息
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
1.首先要从Txt中读取数据,对数据进行简单处理,存入容器中,从需求来看,容器最好使用 Map : key ->名字; value –>存对应朋友的集合
/**用来存储数据,定义在类中,可以在后面的方法直接调用,不用重复的读取文件
* key是name
* value是集合,用来储存对应的朋友
* */
private static HashMap<String, List<String>> userInfo = new HashMap<>();
public static Map<String, List<String>> getUserInfo(String path) {
try (BufferedReader br = new BufferedReader(new FileReader(path));) {
String line;
while ((line = br.readLine()) != null) {
//A:B,C,D,F,E,O,j
//使用":"分割,得到String数组,长度是2,split[0]是A 和 split[1]:B,C,D,F,E,O,j
String[] split = line.split(":");
//对split[1]朋友的字符串再进行分割,B C D F E O j
String[] split2 = split[1].split(",");
//数组转list,通过Arrays.asList()方法得到的list是只读的,会在后续操作中报异常
//用ArrayList构造方法转化为可操作的list
List<String> list = new ArrayList<>(Arrays.asList(split2));
userInfo.put(split[0], list);
}
} catch (Exception e) {
e.printStackTrace();
}
return userInfo;
}
2.获取所有用户对应的好友数量 取人缘最好的用户?
在Map中遍历,对应的好友数量就是list的长度,遍历结果放入map中(key对应name,value对应好友的数量,对map进行按数量排序,实现需求
public static void getfsCount() {
/**
* 使用map.entrySet().stream()得到流
* sorted按value的长度降序
* map:让entrySet里面的元素变成"name = 朋友的数量"
* Collect 收集成list,此时list中存的就是A=7 F=7....
*/
List<String> collect = userInfo.entrySet().stream().sorted((o1,o2)->o2.getValue().size()-o1.getValue().size())
.map(o->{
Integer length = o.getValue().size();
return o.getKey()+"="+length;
}).collect(Collectors.toList());
System.out.println(collect);
//[A=7, F=7, E=5, G=5, H=5, B=4, C=4, D=4, O=4, K=3, L=3, M=3, I=2, J=2, X=1]
}
3.获取所有两两共同的好友信息
首先为了获取两两好友的信息,使用for循环的嵌套遍历,得到信息之后,使用集合中的retainAll求交集的方法,得到共同好友
public static void getSameFS(String descPath) {
//从userInfo中得到keySet
Set<String> keySet = userInfo.keySet();
//Set不能用索引操作元素,这里讲keySet转成list遍历
List<String> list = new ArrayList<>(keySet);
//外层循环,从第0位一直到倒数第二位
for (int i = 0; i < list.size()-1; i++) {
String name1 = list.get(i);
List<String> ufs1 = userInfo.get(name1);
//内层循环.从i+1位开始遍历到集合最后一个元素
for (int j = i + 1; j < list.size(); j++) {
String name2 = list.get(j);
List<String> ufs2 = userInfo.get(name2);
//这里讲ufs2复制到res中,为了在使用retainAll时,不改变原ufs2中的值(也就是userInfo中的value值)
ArrayList<String> res = new ArrayList<>(ufs2);
//交集返回res中
res.retainAll(ufs1);
//加个筛子,没有共同好友的不进行操作
if (res != null && res.size() > 0) {
System.out.println(name1 + "与" + name2 + "的共同好友:" + res);
}
}
}
}