阶梯费用计算demo

阶梯配置

复制代码
[
  {
    "grade": 1,
    "max": 10,
    "min": 0,
    "price":0.5
  },
  {
    "grade": 2,
    "max": 50,
    "min": 10,
    "price":0.8
  },
  {
    "grade": 3,
    "max": 100,
    "min": 50,
    "price":1
  },
  {
    "grade": 4,
    "max": 200,
    "min": 100,
    "price":1.5
  }
]

阶梯费用计算代码

java 复制代码
public class DFTest {
    /**
     *   价格的上限值
     */
    private static double topPrice=5;

    /**
     * 电费阶梯计价
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
         /*计算最终的总金额*/
        Double amount = 0.0;
        /* 费用的点数*/
        double  dushu = 300;
        /* 从配置文件中读取阶梯配置  并按照顺序进行排序*/
        String string = FileUtils.readFileToString(new File("D:\\dev\\ideastore\\big_projects\\flink-cdc-demo\\data.json"),"utf-8");
        List<GradeConfig> list = JSON.parseArray(string, GradeConfig.class);
        List<GradeConfig> gradeConfigs = list.stream().sorted((o1, o2) -> o1.getGrade() - o2.getGrade()).collect(Collectors.toList());

        /* 计算 费用总额*/
        for (int i = 0; i <= gradeConfigs.size() - 1; i++) {
            GradeConfig gradeConfig = gradeConfigs.get(i);
            if ( dushu>gradeConfig.getMin() && dushu<=gradeConfig.getMax()){
//                在这个区间
//                  直接 计算 之前的 所有分区的金额
                Double aDouble = gradeConfigs.stream().filter(x -> x.getGrade() < gradeConfig.getGrade()).map(x -> {
                    double v = (x.getMax() - x.getMin()) * x.getPrice();
                    return v;
                }).reduce((x, y) -> x + y).get();
                amount += aDouble;
                amount += (dushu - gradeConfig.getMin()) * gradeConfig.getPrice();
                break;
            }else if (i==gradeConfigs.size()-1){
//                找到最后一个了还不是则需计算全部区间的金额
                Double aDouble = gradeConfigs.stream().map(x -> {
                    double v = (x.getMax() - x.getMin()) * x.getPrice();
                    return v;
                }).reduce((x, y) -> x + y).get();
                amount += aDouble;
                amount += (dushu- gradeConfig.getMax())*topPrice;
            }else{
//                 还没有找完  继续找
            }
        }
       System.out.println("总金额是:"+amount+"元");
    }
}
相关推荐
2501_947575802 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
骑士雄师2 小时前
java面试题 4:鉴权
java·开发语言
KaMeidebaby3 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
帅次3 小时前
Android 高级工程师面试:Java 基础知识 近1年高频追问 22 题
android·java·面试
蓝胖的四次元口袋3 小时前
Java集合(4)
java·哈希算法
2501_948106914 小时前
计算机毕业设计之基于jsp教科研信息共享系统
java·开发语言·信息可视化·spark·课程设计
TanYYF4 小时前
spring ai入门教程二
java·人工智能·spring
SeeYa-J4 小时前
Spring IOC(Inversion of Control)
java·spring·rpc
kyriewen4 小时前
我筛了 1400 个 Claude Code Skills,留下 5 个天天在用的
前端·ai编程·claude
JNX_SEMI4 小时前
AT2401C 2.4GHz 全集成射频前端单芯片技术解析
前端·单片机·嵌入式硬件·物联网·硬件工程