阶梯费用计算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+"元");
    }
}
相关推荐
深鱼~2 分钟前
【多线程初阶篇 ²】创建线程的方式
java·开发语言·jvm·深度学习·神经网络·opencv
匹马夕阳3 分钟前
Vue3-跨层组件通信Provide/Inject机制详解
前端·javascript·vue.js
相隔一个图书馆的距离6 分钟前
netty系列(五)IdleStateHandler和IdleStateHandlerEventState
java·netty·idlehandler
莫问alicia23 分钟前
苍穹外卖 项目记录 day03
java·开发语言·spring boot·maven
123yhy传奇26 分钟前
【学习总结|DAY028】后端Web实战(部门管理)
java·学习·mysql·log4j·maven·mybatis·web
m0_7482544741 分钟前
将 vue3 项目打包后部署在 springboot 项目运行
java·spring boot·后端
Cikiss43 分钟前
SpringMVC解析
java·服务器·后端·mvc
旧物有情1 小时前
蓝桥杯历届真题--#R格式(C++,Java) 高精度运算
java·c++·蓝桥杯
Pee Wee1 小时前
责任链模式
java·前端·责任链模式
C182981825751 小时前
BeanFactory与factoryBean 区别,请用源码分析,及spring中涉及的点,及应用场景
java·spring