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}
---------------------------------------------------------------------------------------
基于您的个人能力测试,发现您的【语言能力,数学能力,逻辑能力】比较不错