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;
    }
}

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