package com.yami.trading.bean.model; import java.util.*; public class RecomCalculate { private Map recomCount = new HashMap<>(); private Map> recomMap = new HashMap<>(); private List userRecomList; public Map getRecomCount() { return recomCount; } public List getUserRecomList() { return userRecomList; } public Map> getRecomMap() { return recomMap; } public RecomCalculate(List 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 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 recomCount = calculate.getRecomCount(); for (Map.Entry entry : recomCount.entrySet()) { System.out.println("UserId: " + entry.getKey() + ", 推荐了 " + entry.getValue() + " 人"); } Map> recomMap1 = calculate.getRecomMap(); for (Map.Entry> entry : recomMap1.entrySet()) { System.out.println("UserId: " + entry.getKey() + ", 推荐了 " + entry.getValue()); } } public int countRecom(String userId, int depth, Set 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 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; } }