ipo
zyy
2025-12-30 e9520b1f4906738caddd3a6193159fc858d23ce8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.yami.trading.bean.model;
 
import java.util.*;
 
public class RecomCalculate {
 
    private Map<String, Integer> recomCount = new HashMap<>();
    private Map<String, List<String>> recomMap = new HashMap<>();
    private List<UserRecom> userRecomList;
 
    public Map<String, Integer> getRecomCount() {
        return recomCount;
    }
 
    public List<UserRecom> getUserRecomList() {
        return userRecomList;
    }
 
 
    public Map<String, List<String>> getRecomMap() {
        return recomMap;
    }
 
    public RecomCalculate(List<UserRecom> userRecomList) {
        this.userRecomList = userRecomList;
        // 构建推荐映射
        for (UserRecom ur : userRecomList) {
            recomMap.computeIfAbsent(ur.getUserId(), k -> new ArrayList<>()).add(ur.getRecomUserId());
        }
        // 计算推荐人数
        for (String userId : recomMap.keySet()) {
            countRecom(userId, 0, new HashSet<>());
        }
    }
 
    public static void main(String[] args) {
        List<UserRecom> userRecomList = new ArrayList<>();
//        userRecomList.add(new UserRecom("user2", "user1"));
//        userRecomList.add(new UserRecom("user3", "user2"));
//        userRecomList.add(new UserRecom("user4", "user2"));
//        userRecomList.add(new UserRecom("user5", "user4"));
//        userRecomList.add(new UserRecom("user1", "user5"));
 
        RecomCalculate calculate = new RecomCalculate(userRecomList);
        Map<String, Integer> recomCount = calculate.getRecomCount();
        for (Map.Entry<String, Integer> entry : recomCount.entrySet()) {
            System.out.println("UserId: " + entry.getKey() + ", 推荐了 " + entry.getValue() + " 人");
        }
 
 
        Map<String, List<String>> recomMap1 = calculate.getRecomMap();
        for (Map.Entry<String, List<String>> entry : recomMap1.entrySet()) {
            System.out.println("UserId: " + entry.getKey() + ", 推荐了 " + entry.getValue());
        }
    }
 
    public  int countRecom(String userId, int depth, Set<String> visited) {
        if (depth >= 4) {
            return 0;
        }
 
        if (visited.contains(userId)) {
            return 0;
        }
 
        visited.add(userId);
 
        // 如果已经计算过该用户的推荐数,直接返回
        if (recomCount.containsKey(userId)) {
            return recomCount.get(userId);
        }
 
        int count = 0;
        List<String> recomUserIds = recomMap.getOrDefault(userId, new ArrayList<>());
        for (String recomUserId : recomUserIds) {
            count++;
            count += countRecom(recomUserId, depth + 1, new HashSet<>(visited));
        }
 
        recomCount.put(userId, count);
 
        visited.remove(userId);
        return count;
    }
}