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

背景说明

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

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

  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

原文链接:https://www.cnblogs.com/bigbrid/p/17327731.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 双指针项目中的实际应用 - Python技术站

(0)
上一篇 2023年5月4日
下一篇 2023年5月4日

相关文章

  • 匹配form表单中所有内容的正则表达式

    下面我就来详细讲解匹配form表单中所有内容的正则表达式攻略。 步骤一:理解需求 首先需要理解问题的需求,即需要匹配form表单中所有内容的正则表达式。这里的“所有内容”包括form标签及其所有属性,包括每一个input标签及其属性等等。 步骤二:编写匹配表单标签的正则表达式 首先需要匹配form标签,可以使用以下正则表达式: /<form.*?&gt…

    Java 2023年6月15日
    00
  • 一篇文章带你入门Java基本概念

    一篇文章带你入门Java基本概念 Java是一个广泛应用的高级编程语言,它是一种面向对象的语言,体现了一些在C++中经过多年开发和实践所获得的经验,避免了其它更早的面向对象的语言的一些不足,是一个功能强大且通用性很高的编程语言。 基本概念 Java具有丰富的基本概念,其中一些需要初学者掌握: 类 Java中的类是一个蓝图或者模板,它定义了对象包含的属性和方法…

    Java 2023年5月23日
    00
  • JavaScript继承与聚合实例详解

    JavaScript继承与聚合是面向对象编程中常用的两种对象复用技巧。在本文中,我们将详细讲解这两种技巧的实现方式,并通过两个示例说明其使用方法及优缺点。 一、JavaScript继承 继承是面向对象编程中一个重要的概念,它可以让子类继承父类的属性和行为。在JavaScript中,我们可以使用原型链来实现继承。 利用原型链继承 原型链继承是JavaScrip…

    Java 2023年5月26日
    00
  • indexedDB bootstrap angularjs之 MVC DOMO (应用示例)

    “indexedDB bootstrap angularjs之 MVC DOMO (应用示例)”指的是使用indexedDB、bootstrap和angularjs构建MVC模式的web应用程序的示例。以下是详细的攻略: 1. 环境准备 安装Node.js和npm; 安装bower:npm install -g bower; 创建一个新的文件夹,并通过终端进…

    Java 2023年6月15日
    00
  • 在Tomcat服务器下使用连接池连接Oracle数据库

    详细讲解一下在Tomcat服务器下使用连接池连接Oracle数据库的完整攻略。 步骤一:下载JDBC驱动程序 首先需要下载并安装Oracle的JDBC驱动程序。下载地址为:Oracle JDBC驱动程序。 步骤二:配置Tomcat服务器 在Tomcat服务器的 conf 目录下的 context.xml 文件中添加数据库连接池的配置信息,并指定使用的JDBC…

    Java 2023年5月20日
    00
  • Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码 Java 11于2018年9月正式发布,带来了一些令人兴奋的新特性和功能。在本文中,我们将介绍Java 11的八个强大的新特性,并给出一些示例,以帮助您更好地理解它们的使用方式。 1. HttpClient API Java 11引入了一个全新的HTTP客户端API,该API支持异步和基于事…

    Java 2023年5月20日
    00
  • Java对象的创建过程是什么?

    Java对象的创建过程是Java程序中非常基础、也非常重要的一部分。在Java编程中开发者需要清楚理解Java对象创建的整个流程,本文将为读者详细讲解Java对象的创建过程。 Java对象的创建过程 在Java编程中,创建一个Java对象涉及到了三个步骤: 1、类的加载与加载机制 类的加载与加载机制是Java程序启动时的第一步,Java类需要在Java虚拟机…

    Java 2023年5月11日
    00
  • Java 使用maven实现Jsoup简单爬虫案例详解

    下面我将详细讲解“Java使用maven实现Jsoup简单爬虫案例详解”的完整攻略。 什么是Maven Maven 是一种用于 Java 项目管理和构建的工具。Maven 使用一个基于项目对象模型(POM),来管理项目的构建、文档和报告的开源项目管理工具。 什么是Jsoup Jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、H…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部