/**
* 运动排名,睡眠排名,饮食排名,情绪排名
* 如果排名都在前20%,就是最强王者,
* 如果取最大的两个大于90%,他的称号就是前两个排名组合称号,比如运动加睡眠,就是元气满满追风人,
* 如果是睡眠加运动,就是元气满满训练家
*
* @return
*/
public static String yanTest02() {
// 1.先计算出该用户每项的排名占比
// 1.1 排名占比:(该用户的排名/总人数)*100,得出占比百分之多少
// 1.2 重点在于如何得到该用户的排名,可以数据库查询吗?还是怎么弄
// 2.对这个几个排名占比做个排序
// 假设知道了用户的排名以及总人数
// 运动排名
Integer ydMyRankNum = 7;
// 参与运动排名的总人数(不确定你们是否需要区分各个项目的总人数)
Integer ydTotalPersonNum = 100;
// 运动排名占比
BigDecimal yunDongRankPercent = new BigDecimal(ydMyRankNum).multiply(new BigDecimal("100"))
.divide(new BigDecimal(ydTotalPersonNum), 2, RoundingMode.HALF_UP);
// 睡眠排名
Integer smMyRankNum = 8;
Integer smTotalPersonNum = 100;
BigDecimal smRankPercent = new BigDecimal(smMyRankNum).multiply(new BigDecimal("100"))
.divide(new BigDecimal(smTotalPersonNum), 2, RoundingMode.HALF_UP);
// 饮食排名
Integer ysMyRankNum = 15;
Integer ysTotalPersonNum = 100;
BigDecimal ysRankPercent = new BigDecimal(ysMyRankNum).multiply(new BigDecimal("100"))
.divide(new BigDecimal(ysTotalPersonNum), 2, RoundingMode.HALF_UP);
// 情绪排名
Integer qxMyRankNum = 60;
Integer qxTotalPersonNum = 100;
BigDecimal qxRankPercent = new BigDecimal(qxMyRankNum).multiply(new BigDecimal("100"))
.divide(new BigDecimal(qxTotalPersonNum), 2, RoundingMode.HALF_UP);
List<TypeRank> rankPercentList = new ArrayList<>();
rankPercentList.add(new TypeRank("运动", yunDongRankPercent));
rankPercentList.add(new TypeRank("睡眠", smRankPercent));
rankPercentList.add(new TypeRank("饮食", ysRankPercent));
rankPercentList.add(new TypeRank("情绪", qxRankPercent));
// 正序排,也可以写成rankPercentList.sort(Comparator.comparing(TypeRank::getRankPercent))
rankPercentList.sort((o1, o2) -> o1.getRankPercent().compareTo(o2.getRankPercent()));
System.out.println("rankPercentList=" + rankPercentList);
// 前20%数量
int less20Count = 0;
BigDecimal percent20 = new BigDecimal("20");
BigDecimal percent10 = new BigDecimal("10");
// 取最大的两个,并且排名在前10%的项目列表
List<TypeRank> maxTwoOver90List = new ArrayList<>();
for (int i = 0; i < rankPercentList.size(); i++) {
TypeRank item = rankPercentList.get(i);
// 排名前20%
if (percent20.compareTo(item.getRankPercent()) >= 0) {
less20Count++;
}
// 取最大的两个,并且排名在前10%的(超过90%的人)
if (i <= 1 && percent10.compareTo(item.getRankPercent()) > 0) {
maxTwoOver90List.add(item);
}
}
System.out.println("less20Count=" + less20Count);
System.out.println("maxTwoOver90List=" + maxTwoOver90List);
if (rankPercentList.size() == less20Count) {
return "最强王者";
}
// 不存在两个排名在前10%的项目,没有称号,直接返回
if (maxTwoOver90List.size() < 2) {
return "无";
}
// 两个排名在前10%的项目排列组合,对应的称号 (注:这个Map可以放到方法外边)
Map<String, String> titleMap = new HashMap<>(16);
titleMap.put("运动_睡眠", "元气满满追风人");
titleMap.put("睡眠_运动", "元气满满训练家");
titleMap.put("运动_饮食", "运动_饮食达人");
titleMap.put("饮食_运动", "饮食_运动达人");
titleMap.put("运动_情绪", "运动_情绪达人");
titleMap.put("情绪_运动", "情绪_运动达人");
titleMap.put("睡眠_饮食", "睡眠_饮食达人");
titleMap.put("饮食_睡眠", "饮食_睡眠达人");
titleMap.put("睡眠_情绪", "睡眠_情绪达人");
titleMap.put("情绪_睡眠", "情绪_睡眠达人");
titleMap.put("饮食_情绪", "饮食_情绪达人");
titleMap.put("情绪_饮食", "情绪_饮食达人");
// 两个排名在前10%的项目排列组合
String typeNameGroup = maxTwoOver90List.get(0).getTypeName() + "_" + maxTwoOver90List.get(1).getTypeName();
return titleMap.getOrDefault(typeNameGroup, "无");
}
/**
* @author zhudong
*/
@Data
public class TypeRank {
/**
* 类型
*/
private String typeName;
/**
* 排名占比
*/
private BigDecimal rankPercent;
public TypeRank() {
}
public TypeRank(String typeName, BigDecimal rankPercent) {
this.typeName = typeName;
this.rankPercent = rankPercent;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
rankPercentList=[{"rankPercent":7.00,"typeName":"运动"}, {"rankPercent":8.00,"typeName":"睡眠"}, {"rankPercent":15.00,"typeName":"饮食"}, {"rankPercent":60.00,"typeName":"情绪"}]
less20Count=3
maxTwoOver90List=[{"rankPercent":7.00,"typeName":"运动"}, {"rankPercent":8.00,"typeName":"睡眠"}]
元气满满追风人