Java實現“推薦註冊,獲得獎勵”算法

應用場景:推薦新用戶註冊
A會員推薦B註冊,即贈送A會員100積分,B會員推薦C會員註冊,贈送A會員50積分、B會員各100積分,依次類推,只要A發展的會員繼續發展下面的會員,A都可以獲增相應的積分。 

package com.enn.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 推薦註冊,獲得獎勵
 * 第一次推薦獲得1分,第二級獲得0.5分,依次遞減
 */
public class Recommend {

    public static Map<String, String> RecommendMap = new HashMap<String, String>();

    static {
        //當前用戶,推薦用戶,A推薦了C和D
        RecommendMap.put("A", "");
        RecommendMap.put("B", "");
        RecommendMap.put("C", "A");//1
        RecommendMap.put("D", "A");//1
        RecommendMap.put("E", "C");//0.5
        RecommendMap.put("F", "E");//0.25
        RecommendMap.put("G", "D");//0.5
        RecommendMap.put("H", "E");//0.25
        RecommendMap.put("I", "F");//0.125
    }

    public static void main(String[] args) {
        getRecommend("A"); 
    }
    
    public static void getRecommend(String user){
        List list = new ArrayList();
        list.add(user);
        Map map = new HashMap();
        map.put("score", 0.0);
        map.put("level", 0.0);
        map.put("recommendList", list);

        Map<String, Object> resultMap = recommendLoop(map);
        double score = (double) resultMap.get("score");
        System.out.println(list + "," + score);
    }

    public static Map recommendLoop(Map map) {
        double score = (double) map.get("score");
        double level = (double) map.get("level");
        List<String> userList = (List) map.get("recommendList");
        List<String> recommendList = new ArrayList();
        for (Map.Entry<String, String> userMap : RecommendMap.entrySet()) {
            String key = userMap.getKey();
            String value = userMap.getValue();

            if (userList.contains(value)) {
                score = score + 1 / Math.pow(2, level);//每遞減一級,獲得2^n個積分
                recommendList.add(key);
            }
        }
        //迭代
        while (recommendList != null && recommendList.size() > 0) {
            level += 1;
            Map newMap = new HashMap();
            newMap.put("score", score);
            newMap.put("level", level);
            newMap.put("recommendList", recommendList);
            Map<String, Object> _resultMap = recommendLoop(newMap);
            score = (double) _resultMap.get("score");
            level = (double) _resultMap.get("level");
            recommendList = (List) _resultMap.get("recommendList");
        }

        Map resultMap = new HashMap();
        resultMap.put("score", score);
        resultMap.put("level", level);
        resultMap.put("recommendList", recommendList);

        return resultMap;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章