Java实现课程推荐算法

1.需求分析

现在有课程若干,需要在用户打开客户端时,推荐给用户相关内容。具体推荐规则如下:

  • 有3个以上4分以上的:“基于您的个人能力测试,发现您的【xxx、xxx、xxx】很强”;
    a) Xxx: 为能力,随机选3个最高值。
    比如:您的基于您的个人能力测试,发现您“语言能力、英语能力、逻辑能力”能力很强
  • ¬ 有4分以上的:“基于您的个人能力测试,发现您的【xxx、xxx、xxx】比较不错”;
    a) Xxx: 为能力,随机选3个最高值。
  • ¬ 没有4分以上的,3分及以下,提示能力最高的3个;同样分值,随机取几个,凑个3个能力:
    a) 基于您的个人能力测试,发现您的【xxx、xxx 】能力比较均衡.;
    比如:您的基于您的个人能力测试,发现您“语言能力、英语能力、逻辑能力”能力均衡

2.实现思路

设计思路其实很简单,我们需要把获取到的分数降序排序,如果相同就随机推荐相同分值的科目。

因为是K-V值关系的数据关系,所以可以选择用Map,用到排序,选用Map中的TreeMap,自己定义排序规则,需手写Compare方法。

3.具体代码
public class demo {

    public static void main(String[] args) {
        String result = "";
        Integer finalSize = 3;
        double math = 4.2;
        double chinese = 3;
        double english = 2;
        double computer = 3;
        double design = 3;
        double practice = 1;

        Map<String,Object> map = new HashMap<String, Object>();
        map.put("数学能力",math);
        map.put("语言能力",chinese);
        map.put("英文能力",english);
        map.put("逻辑能力",computer);
        map.put("设计能力",design);
        map.put("体育能力",practice);

        Map<String,Double> good = new HashMap<String, Double>();
        Map<String,Double> normal = new HashMap<String, Double>();
        Map<String,Double> bad = new HashMap<String, Double>();

        for (Map.Entry<String,Object> entry : map.entrySet()) {
            Double score =  (Double) entry.getValue();
            String classes = entry.getKey();
            if (score >= 4) {
                good.put(classes,score);
            } else if (score>=3 && score<4) {
                normal.put(classes,score);
            } else {
                bad.put(classes,score);
            }
        }

        Map<String, Double> map1 = new TreeMap<String, Double>(new MapValueComparator<Double>(good));
        Map<String, Double> map2 = new TreeMap<String, Double>(new MapValueComparator<Double>(normal));
        Map<String, Double> map3 = new TreeMap<String, Double>(new MapValueComparator<Double>(bad));
        map1.putAll(good);
        map2.putAll(normal);
        map3.putAll(bad);

        String[] keys = map1.keySet().toArray(new String[0]);
        String[] keys1 = map2.keySet().toArray(new String[0]);
        String[] keys2 = map3.keySet().toArray(new String[0]);
        System.out.println("测试前:"+map.toString());

        if (good.size() >= 3) {
            System.out.println("基于您的个人能力测试,发现您的【"+Random(keys,result,finalSize)+"】能力很强");
        } else if (good.size()>0 && (normal.size()+good.size()>=3 || bad.size()+good.size()>=3)) {
            for (String xx : keys) {  result += (result == "" || result == null) ? xx : ","+xx;}
            finalSize -= keys.length;
            if (normal.size()+good.size() >= 3) {
                System.out.println("基于您的个人能力测试,发现您的【"+Random(keys1,result,finalSize)+"】比较不错");
            } else if (bad.size()+good.size() >= 3 &&  normal.size() == 0) {
                System.out.println("基于您的个人能力测试,发现您的【"+Random(keys2,result,finalSize)+"】比较不错");
            } else {
                for (String xx : keys1) {  result += (result == "" || result == null) ? xx : ","+xx;}
                finalSize -= keys1.length;
                System.out.println("基于您的个人能力测试,发现您的【"+Random(keys2,result,finalSize)+"】比较不错");
            }
        } else {
            if (keys1.length >= 3) {
                System.out.println("基于您的个人能力测试,发现您的【"+Random(keys1,result,finalSize)+"】比较均衡");
            } else {
                for (String xx : keys1) {  result += (result == "" || result == null) ? xx : ","+xx;}
                finalSize -= keys1.length;
                System.out.println("基于您的个人能力测试,发现您的【"+Random(keys2,result,finalSize)+"】比较均衡");
            }
        }

    }



    /**
     * @Author Ragty
     * @Description  随机科目
     * @Date 11:07 2019/4/8
     **/
    public static String Random(String[] keys,String result,Integer finalSize) {
        for (int i=0; i<finalSize; i++) {
            result += (result == "" || result == null) ? keys[i] : ","+keys[i];
        }
        return result;
    }



    /**
     * @Author Ragty
     * @Description  比较器(按值排序,相同的随机取值)
     * @Date 10:38 2019/4/9
     **/
    public static class MapValueComparator<T extends Comparable<T>> implements Comparator<String> {
        private Map<String, T> map = null;
        public MapValueComparator(Map<String, T> map) {
            this.map = map;
        }

        public int compare(String o1, String o2) {
            int r = map.get(o2).compareTo(map.get(o1));
            if (r != 0) {
                return r;
            }
            int randomOne = (int) (Math.random() * 10);
            int randomTwo = (int) (Math.random() * 10);
            return randomOne - randomTwo;
        }
    }

}

4.测试结果(多组结果)
测试前:{语言能力=4.2, 设计能力=3.0, 英文能力=2.0, 数学能力=3.0, 逻辑能力=3.0, 体育能力=1.0}
---------------------------------------------------------------------------------------
基于您的个人能力测试,发现您的【语言能力,数学能力,设计能力】比较不错

测试前:{语言能力=4.2, 设计能力=3.0, 英文能力=2.0, 数学能力=3.0, 逻辑能力=3.0, 体育能力=1.0}
---------------------------------------------------------------------------------------
基于您的个人能力测试,发现您的【语言能力,逻辑能力,设计能力】比较不错

测试前:{语言能力=4.2, 设计能力=3.0, 英文能力=2.0, 数学能力=3.0, 逻辑能力=3.0, 体育能力=1.0}
---------------------------------------------------------------------------------------
基于您的个人能力测试,发现您的【语言能力,数学能力,逻辑能力】比较不错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值