首页 > 编程语言 >Java 双指针项目中的实际应用

Java 双指针项目中的实际应用

时间:2023-05-04 20:34:51浏览次数:34  
标签:info billAmount Java BigDecimal 核销 应用 new preAmount 指针

背景说明

最近在做财务相关的系统,对账单核销预付款
从技术角度来看就是将两个数组进行合并

对账单核销预付款前提条件:

  1. 对账单总金额必须等于未核销金额

数据示例

对账单数据

单号 金额
B0001 100
B0002 80
B0003 120

预付款数据

单号 未核销金额
PRE001 110
PRE002 190

结果数据

预付款单号 核销金额 对账单号
PRE001 100 B001
PRE001 10 B002
PRE002 70 B002
PRE002 120 B003

通过分析可以使用JAVA双指针算法可以实现这个需求
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。

代码实现

public static void main(String[] args) {
    class Info {
        private String formId;
        private BigDecimal amount;
    
        public String getFormId() {
            return formId;
        }
    
        public void setFormId(String formId) {
            this.formId = formId;
        }
    
        public BigDecimal getAmount() {
            return amount;
        }
    
        public void setAmount(BigDecimal amount) {
            this.amount = amount;
        }
    }
    
    List<Info> billBatchlist = new ArrayList<>();
    Info info = new Info();
    info.setFormId("B0001");
    info.setAmount(new BigDecimal(100));
    billBatchlist.add(info);
    info = new Info();
    info.setFormId("B0002");
    info.setAmount(new BigDecimal(80));
    billBatchlist.add(info);
    info = new Info();
    info.setFormId("B0003");
    info.setAmount(new BigDecimal(120));
    billBatchlist.add(info);
    
    List<Info> payVerifyControlList = new ArrayList<>();
    Info info1 = new Info();
    info1.setFormId("PRE0001");
    info1.setAmount(new BigDecimal(110));
    payVerifyControlList.add(info1);
    info1 = new Info();
    info1.setFormId("PRE0002");
    info1.setAmount(new BigDecimal(190));
    payVerifyControlList.add(info1);
    billBatchlist.forEach(a -> {
        System.out.println("BillFormId:" + a.formId + ",Amount:" + a.getAmount());
    });
    payVerifyControlList.forEach(a -> {
        System.out.println("PreFormId:" + a.formId + ",Amount:" + a.getAmount());
    });
    System.out.println("==================================");
    
    int i = 0, j = 0;
    BigDecimal preAmount = new BigDecimal(0);
    BigDecimal billAmount = new BigDecimal(0);
    while (i < billBatchlist.size() && j < payVerifyControlList.size()) {
        if (preAmount.compareTo(BigDecimal.ZERO) == 0) {
            preAmount = billBatchlist.get(i).amount;
        }
        if (billAmount.compareTo(BigDecimal.ZERO) == 0) {
            billAmount = payVerifyControlList.get(j).amount;
        }
    
        //当前核销金额
        BigDecimal verifyAmount = new BigDecimal(0);
        if (preAmount.compareTo(billAmount) > -1) {
            verifyAmount = billAmount;
            // pre剩余
            preAmount = preAmount.subtract(verifyAmount);
            billAmount = new BigDecimal(0);
        } else {
            verifyAmount = preAmount;
            // bill剩余
            billAmount = billAmount.subtract(verifyAmount);
            preAmount = new BigDecimal(0);
        }
    
        System.out.println("当前核销金额:" + verifyAmount + ",preAmount剩余:" + preAmount + ",billAmount剩余:" + billAmount);
        //大于等于0
        if (preAmount.compareTo(BigDecimal.ZERO) == 0) {
            i++;
        }
        if (billAmount.compareTo(BigDecimal.ZERO) == 0) {
            j++;
        }
    }
    }

打印结果:

BillFormId:B0001,Amount:100
BillFormId:B0002,Amount:80
BillFormId:B0003,Amount:120
PreFormId:PRE0001,Amount:110
PreFormId:PRE0002,Amount:190
==================================
当前核销金额:100,preAmount剩余:0,billAmount剩余:10
当前核销金额:10,preAmount剩余:70,billAmount剩余:0
当前核销金额:70,preAmount剩余:0,billAmount剩余:120
当前核销金额:120,preAmount剩余:0,billAmount剩余:0

标签:info,billAmount,Java,BigDecimal,核销,应用,new,preAmount,指针
From: https://www.cnblogs.com/bigbrid/p/17327731.html

相关文章

  • Opencv技术应用
     OpenCV是一个开源的计算机视觉库,可以用于实现各种视觉任务,例如图像处理、物体识别、目标跟踪、人脸检测等。OpenCV具有丰富的图像处理和计算机视觉算法,例如边缘检测、滤波、形态学处理、特征提取和匹配等,可以帮助开发人员实现各种视觉任务,同时具有高效性、灵活性和易用性等优点......
  • Exp6 MSF应用基础 20201331黄文刚
    Exp6MSF应用基础一、实验原理(1)MSF简介Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具。(2)程序特点这种可以扩展的模型将负载控制,编码器,无操作生成器和漏洞整合在一起,使M......
  • Exp6 MSF应用基础-20201324
    目录1实践内容1.0安装靶机1.1一个主动攻击实践,尽量使用最新的类似漏洞;主动攻击实践MS08-0671.2一个针对浏览器的攻击,尽量使用最新的类似漏洞;1.2.1针对浏览器的攻击ms06_013_createtextrange1.2.2针对浏览器的攻击MS14-0641.3一个针对客户端的攻击,如Adobe或office,尽量使用最......
  • Java学习笔记(九)
    1、代理模式的概念可以为其它对象提供一种代理以控制对这个对象的访问,屏蔽对真实角色的直接访问。2、为什么要重写toString()方法?默认情况下,toString()方法返回的字符串是由对象的类名、“@”符号和对象的哈希码组成的。我们需要重写toString()方法,以便返回更有意义和有用的字......
  • Java练手项目(尚硅谷的),不涉及框架,数据库等。
    软件:idea我是先建立了一个空白的项目,自己创建的src包和其下面的包。问题一:建立包之后发现格式为src.com.tjp.bean没办法建立其他与bean同级的servicetestutilsview等。只允许继续建立bean的子包。解决:这是因为idea自动会折叠空白包。(不同版本的idea可能和我的位置不太一......
  • JAVA中字符串的常用方法
    JAVA中字符串的常用方法字符串不能改变,创建后就无法更改了创建字符串的两种方式直接赋值new的方式获取一个字符串对象 构造方法构造方法说明publicString()创建空白字符串,不包含任何内容publicString(StringOriginal)根据传入的字符串,创建字符串对象......
  • 点击×然后隐藏应用到托盘中
    electron关闭页面隐藏到托盘使用electron的Tray模块。该模块可以添加图标和上下文菜单到系统通知区。下面是主要代码:import{Menu,Tray}=require('electron');letwin;functioncreateMainWindow(){//运行根路径获取托盘图标constrootSrc=process.cwd();c......
  • java面对对象编程-内部类
    内部类内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对于B类来说就是外部类了。成员内部类静态内部类 局部内部类(写在方法里) 匿名内部类 外部类:用new,内部类:通过外部类来实例化内部类 内......
  • JavaSE【2】-基础语法
    JavaSE【2】-基础语法一、Java数据类型在Java语言中将所有的数据类型划分为两大类:八大基本数据类型复合引用类型八大基本数据类型:|------数值型|-整数类型:byte(字节)、short(短整型)、int(整型)、long(长整型)......
  • JavaSE【1】-环境搭建
    JavaSE【1】-环境搭建一、Java开发环境的搭建所谓的Java开发环境的搭建,其实就是构建出一套可以编译和执行Java应用程序的软件工具;在Java开发环境的搭建中需要安装JDK的软件工具(Java开发工具包);1.1、搭建的步骤1、下载JDK安装包(要求是不低于1.7的版本);2、安装JDK软件(非C盘即可......