运动排名称号

发布时间 2023-10-27 18:53:55作者: 轨迹320
/**
     * 运动排名,睡眠排名,饮食排名,情绪排名
     * 如果排名都在前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":"睡眠"}]
元气满满追风人