Java实现课程推荐算法

news/2024/5/19 23:20:26 标签: 推荐算法, 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}
---------------------------------------------------------------------------------------
基于您的个人能力测试,发现您的【语言能力,数学能力,逻辑能力】比较不错

http://www.niftyadmin.cn/n/1661976.html

相关文章

数据结构思维笔记(一)接口

1.为什么要有两种List Java中List接口为ArrayList, LinkedList都继承于List.哪一个更适合于特定的应用程序&#xff0c;取决于它最常执行的操作.对于一些应用&#xff0c;LinkedList更快&#xff1b;对于其他应用&#xff0c;ArrayList更快. 2.List接口 public class ListClie…

数据结构思维笔记(二) 算法分析

1.简单算法分类 常数时间O(1)&#xff1a;不依赖于输入线性O(n):依赖于输入&#xff0c;并跟输入量大小成正比平方O(n^2 ):随着n的增长变为n^2 2.简单排序 public class SelectionSort {/*** Swaps the elements at indexes i and j.*/public static void swapElements(int[…

数据结构思维笔记(三)ArrayList

1.Add方法 单参方法(分析它的时间复杂度) Overridepublic boolean add(T element) {//make a bigger array and copy over the elementsif (size > array.length) {T[] bigger new Object[array.length * 2];System.arraycopy(array,0,bigger,0,array.length);array big…

数据结构思维笔记(四)LinkedList

1.链式数据结构 在链表中&#xff0c;每个节点包含列表中下一个节点的引用. 其它的链表结构包括树和图&#xff0c;其中节点可以包含多个其它节点的引用。 简单的节点Demo public class ListNode {public Object node;public ListNode next;//init Nodepublic ListNode() {thi…

数据结构思维笔记(五)性能分析

对于下一个练习&#xff0c;我提供了一个Profiler类&#xff0c;它包含代码&#xff0c;使用一系列问题规模运行方法&#xff0c;测量运行时间和绘制结果。 你将使用Profiler&#xff0c;为 Java 的实现ArrayList和LinkedList&#xff0c;划分add方法的性能。 Profiler.java包含…

数据结构思维笔记(六)双链表

1.双链表数据结构 List和Deque接口的双链表实现。[…] 所有的操作都能像双向列表那样执行。索引该列表中的操作将从头或者尾遍历列表&#xff0c;使用更接近指定索引的那个。 每个节点包含下一个节点的链接和上一个节点的链接。LinkedList对象包含指向列表的第一个和最后一个元…

数据结构思维笔记(七) 树的遍历

本章将介绍一个 Web 搜索引擎&#xff0c;我们将在本书其余部分开发它。我描述了搜索引擎的元素&#xff0c;并介绍了第一个应用程序&#xff0c;一个从维基百科下载和解析页面的 Web 爬行器。本章还介绍了深度优先搜索的递归实现&#xff0c;以及迭代实现&#xff0c;它使用 J…

数据结构思维笔记(八)到达哲学

本章的目标是开发一个Web爬虫&#xff0c;同时验证之前提到的 到达哲学 1.起步 首先介绍本章中帮你起步的代码&#xff1a; WikiNodeExample.java包含前一章的代码&#xff0c;展示了 DOM 树中深度优先搜索&#xff08;DFS&#xff09;的递归和迭代实现。WikiNodeIterable.ja…