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

yizhihongxing

背景说明

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

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

  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日

相关文章

  • Spring整合ehCache全过程

    下面我将为您详细讲解Spring整合ehCache全过程的完整攻略,包含以下步骤: 引入依赖: 需要将spring-context-support和ehcache的依赖引入到项目中,pom.xml中的配置如下: <dependencies> <dependency> <groupId>org.springframework…

    Java 2023年5月20日
    00
  • Java实现简单学生信息管理系统

    Java实现简单学生信息管理系统攻略 一、项目背景 随着教育信息化的发展,学生信息管理系统已经成为了中小学校管理工作不可或缺的一部分。Java是一门广泛应用于企业级开发的编程语言,具有高效性、安全性、跨平台性等特点。本篇攻略将介绍如何用Java语言实现一个简单的学生信息管理系统。 二、系统功能设计 该学生信息管理系统的主要功能包括:- 添加学生信息- 删除学…

    Java 2023年5月19日
    00
  • php好代码风格的阶段性总结

    PHP好代码风格的阶段性总结 为什么需要好的代码风格 良好的代码风格可以方便程序员查看、修改和维护代码。在团队合作开发中,一致的代码风格也有助于协作开发。 好的代码风格应该具备的特点 可读性强,注释清晰明了; 缩进和格式规范化; 变量和函数命名规范化; 代码冗余和复杂度控制; 合理的代码组织结构。 阶段性总结:如何实现好的代码风格 第一阶段:选择适合的代码风…

    Java 2023年5月26日
    00
  • MyBatis如何实现流式查询的示例代码

    流式查询是MyBatis中常用的一种查询方式,能够在处理大量数据时提高查询效率。以下是详细的 MyBatis 如何实现流式查询的攻略,包括两条示例代码: 1. 流式查询 流式查询被称为“游标”查询,是基于 JDBC 游标实现的。它的实现方式是通过一次读取一批数据,然后处理它们,最后再继续读取下一批数据。这样可以避免一次性读取所有匹配数据所带来的内存开销和响应…

    Java 2023年5月19日
    00
  • SpringMVC集成FastJson使用流程详解

    SpringMVC集成FastJson使用流程详解 FastJson是阿里巴巴开源的一个JSON解析库,它可以将Java对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换为Java对象。在SpringMVC中,我们可以使用FastJson来处理JSON格式的数据。本文将详细讲解SpringMVC集成FastJson的使用流程,并提供两个示例说明…

    Java 2023年5月17日
    00
  • 为什么Java 8取消了永久代?

    为什么Java 8取消了永久代? 在Java 8之前,Java虚拟机有一块非堆内存称为永久代(PermGen),它专门用于存放类的元数据信息、常量池、方法区和静态变量等内容。由于永久代有一定的内存限制,并且它是基于线性扫描和GC Roots扫描来进行垃圾回收的,所以在大量类的场景下容易出现“永久代溢出”的问题。此外,永久代和堆内存的内存管理方式不同,会导致被…

    Java 2023年5月11日
    00
  • 详解springmvc之json数据交互controller方法返回值为简单类型

    下面是详解springmvc之json数据交互controller方法返回值为简单类型的攻略。 什么是Spring MVC? Spring MVC是一个基于Java的Web框架,用于开发Web应用程序。它使用Java Servlet API和为其定义的JavaServer Pages(JSP)规范来实现Web组件。 什么是JSON? JSON(JavaScr…

    Java 2023年5月26日
    00
  • Java 3年面试经验告诉你Mybatis是如何进行分页的

    我来帮你详细讲解一下关于“Java 3年面试经验告诉你Mybatis是如何进行分页的”的攻略。 简介 Mybatis 是一个非常流行的 Java 中间件,它可以帮助我们轻松地连接数据库并进行数据操作。在进行实际的开发过程中,数据量通常都是比较大的,因此我们需要对数据进行分页显示,这样才能更好的提高查询效率并减少资源消耗。 Mybatis 分页原理 Mybat…

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