1.社交用户关系分析

需求:
求出有共同好友的用户对及他们的共同好友,如:
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);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值