算法结构的微小差异引起结构和性能上的差异性

两个方法都是做盘点数据与库存数据的比较,method2为修改后方法,两个方法结构调整的意义,是否带来结构上的优化和性能上的提升?

if(){}else{}的嵌套使用相较于if(){},if(){}结构上的优劣又体现在哪里?

Method1:

/**
     * 一次盘点与库存比较
     *
     * @param list盘点数据集
     * @param checkId
     * @return listReault差异结果集
     */
    private List<StorageCheckDiffReaultDetail> compareFirstDetail2(int checkId){
        StorageCheck storageCheck = storageCheckDao.findById(checkId);
        if(storageCheck==null){
            throw new RuntimeException("盘点id不存在!!!");
        }
        Integer positionId=storageCheck.getPositionId();
        // 比较结果
        List<StorageCheckDiffReaultDetail> listResault = new ArrayList<StorageCheckDiffReaultDetail>();
        // 把库存封装成StorageCheckSnapDataDetail对象列表
        List<StorageCheckSnapDataDetail> listPosDetails = processGetListPosDetail(positionId);
        // 把快照数据封装成StorageCheckSnapDataDetail对象列表
        List<StorageCheckSnapDataDetail> listSnapDetails = processFindListSnapDetail(checkId);
        //排序
        Collections.sort(listPosDetails);
        Collections.sort(listSnapDetails);
        int j=0;
        int i=0;
        for (;;) {
            if(i>=listSnapDetails.size()&&j>=listPosDetails.size()){//不存在数据结束循环
                break;
            }
            Integer posSkuId=listPosDetails.get(j).getSkuId();
            Integer posNum=listPosDetails.get(j).getSnapNum();
            if(i>=listSnapDetails.size()&&j<listPosDetails.size()){//只剩库存数据
                StorageCheckDiffReaultDetail diffData=
                        new StorageCheckDiffReaultDetail(posSkuId, 0, posNum);
                listResault.add(diffData);
                j++;
                continue;
            }
            Integer snapSkuId=listSnapDetails.get(i).getSkuId();
            Integer snapNum=listSnapDetails.get(i).getSnapNum();
            if(j>=listPosDetails.size()&&i<listSnapDetails.size()){//只剩真实盘点数据
                StorageCheckDiffReaultDetail diffData=
                        new StorageCheckDiffReaultDetail(snapSkuId, snapNum, 0);
                listResault.add(diffData);
                i++;
                continue;
            }

            if(snapSkuId.equals(posSkuId)){//skuId相同,
                if(snapNum.equals(posNum)){//数量相同
                }else{//数量不同
                    StorageCheckDiffReaultDetail diffData=
                            new StorageCheckDiffReaultDetail(snapSkuId, snapNum, posNum);
                    listResault.add(diffData);
                }
                i++;
                j++;
                continue;
            }else{//skuId不同
                if(snapSkuId<posSkuId){//真实数据存在,库存不存在
                    StorageCheckDiffReaultDetail diffData=
                            new StorageCheckDiffReaultDetail(snapSkuId, snapNum, 0);
                    listResault.add(diffData);
                    i++;
                    continue;
                }else{//真实数据不存在,库存存在
                    StorageCheckDiffReaultDetail diffData=
                            new StorageCheckDiffReaultDetail(posSkuId, 0, posNum);
                    listResault.add(diffData);
                    j++;
                    continue;
                }
            }
        }
        return listResault;
    }
    

Method2:

/**
     * 一次盘点与库存比较
     *
     * @param list盘点数据集
     * @param checkId
     * @return listReault差异结果集
     */
    private List<StorageCheckDiffReaultDetail> compareFirstDetail(int checkId){
        StorageCheck storageCheck = storageCheckDao.findById(checkId);
        if(storageCheck==null){
            throw new RuntimeException("盘点id不存在!!!");
        }
        Integer positionId=storageCheck.getPositionId();
        // 比较结果
        List<StorageCheckDiffReaultDetail> listResault = new ArrayList<StorageCheckDiffReaultDetail>();
        // 把库存封装成StorageCheckSnapDataDetail对象列表
        List<StorageCheckSnapDataDetail> listPosDetails = processGetListPosDetail(positionId);
        // 把快照数据封装成StorageCheckSnapDataDetail对象列表
        List<StorageCheckSnapDataDetail> listSnapDetails = processFindListSnapDetail(checkId);
        //排序
        Collections.sort(listPosDetails);
        Collections.sort(listSnapDetails);
        int j=0;
        int i=0;
        while(i<listSnapDetails.size()&&j<listPosDetails.size()) {
            Integer posSkuId=listPosDetails.get(j).getSkuId();
            Integer posNum=listPosDetails.get(j).getSnapNum();
            Integer snapSkuId=listSnapDetails.get(i).getSkuId();
            Integer snapNum=listSnapDetails.get(i).getSnapNum();
            // skuId和数量都相同
            if(snapSkuId.equals(posSkuId) && snapNum.equals(posNum)){
                i++;
                j++;
                continue;
            }
            // skuId相同但数量不同
            if (snapSkuId.equals(posSkuId) && !snapNum.equals(posNum)) {
                listResault.add(new StorageCheckDiffReaultDetail(snapSkuId, snapNum, posNum));
                i++;
                j++;
                continue;
            }
            // skuId不同:真实数据存在,库存不存在
            if (snapSkuId < posSkuId) {// 真实数据存在,库存不存在
                listResault.add(new StorageCheckDiffReaultDetail(snapSkuId, snapNum, 0));
                i++;
                continue;
            }
            // skuId不同:真实数据不存在,库存存在
            listResault.add(new StorageCheckDiffReaultDetail(posSkuId, 0, posNum));
            j++;
            continue;
        };
        List<StorageCheckSnapDataDetail> listSnap;
        // 如果快照有剩余记录,全部添加到listResults中
        if(i<listSnapDetails.size()) {
            listSnap= listSnapDetails.subList(i, listSnapDetails.size());
            for (StorageCheckSnapDataDetail dataDetail : listSnap) {
                listResault.add(new StorageCheckDiffReaultDetail(dataDetail.getSkuId(), dataDetail.getSnapNum(), 0));
            }
        }
        // 如果实际库存有剩余记录,全部添加到listResults中
        if(j<listPosDetails.size()) {
            //listResault.addAll(restCheckList(listPosDetails, j));
            listSnap= listPosDetails.subList(i, listPosDetails.size());
            for (StorageCheckSnapDataDetail dataDetail : listSnap) {
                listResault.add(new StorageCheckDiffReaultDetail(dataDetail.getSkuId(), 0,dataDetail.getSnapNum()));
            }
        }
        return listResault;
    }
时间: 2024-10-08 10:29:50

算法结构的微小差异引起结构和性能上的差异性的相关文章

数据结构与算法 1 :基本概念,线性表顺序结构,线性表链式结构,单向循环链表

[本文谢绝转载] <大纲> 数据结构: 起源: 基本概念 数据结构指数据对象中数据元素之间的关系  逻辑结构 物理结构 数据的运算 算法概念: 概念 算法和数据结构区别 算法特性 算法效率的度量 大O表示法 时间复杂度案例 空间复杂度 时间换空间案例 1)线性表: 线性表初步认识: 线性表顺序结构案例 线性表顺序结构案例,单文件版 线性表的优缺点 企业级线性表链式存储案例:C语言实现 企业级线性表链式存储案例:C语言实现 单文件版 企业级线性表链式存储案例,我的练习  线性表链式存储优点缺点

OSI七(八)层结构 &amp; TCP/IP 4层结构

OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于不同层的中继系统具有不同的名称. 一个设备工作在哪一层,关键看它工作时利用哪一层的数据头部信息.网桥工作时,是以MAC头部来决定转发端口的,因此显然它是数据链路层的设备. 具体说: 物理层:网卡,网线,集线器,中继器,调制解调器 数据链路层:网桥,交换机 网络层:路由器 网关工作在第四层传输层及其以

线性表的顺序存储结构和链式存储结构

前言 上一篇<栈>中提到了栈的顺序存储结构和链式存储结构,现在就对此做个简单的比较.因为栈是线性表的一种,顺序存储结构和链式存储结构实际是线性表的两种存储方式.而栈和队列都是两种重要的线性表结构.所以本文标题直接为线性表的顺序存储结构和链式存储结构. 开始比较两种不同的存储方式 一.顺序存储结构(也可称为顺序表) 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析

转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/51159419 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析 工作一段时间后,经常会被领导说,你这个进入速度太慢了,竞品的进入速度很快,你搞下优化吧?每当这时,你会怎么办?功能实现都有啊,进入时要加载那么多view,这也没办法啊,等等. 先看一些现象吧:用Android studio,新建一个Activity自动生成的

结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆

实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 (1). insert(上滤) 插入末尾 26,不断向上比较,大于26则交换位置,小于则停止. (2). deleteMin(下滤) 提取末尾元素,放在堆顶,不断下滤: (3). 其他操作: 都是基于insert(上滤)与deleteMin(下滤)的操作. 减小元素:减小节点的值,上滤调整堆. 增大

简要比较线性表的顺序存储结构和链式存储结构

我们分别从存储分配方式.时间性能.空间性能三方面来做对比. 存储分配方式 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素. 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 时间性能 <1>查找 顺序存储结构O(1) 单链表O(n) <2>插入和删除 顺序存储结构需要平均移动表长一半的元素,时间为O(n) 单链表在计算出某位置的指针后,插入和删除时间仅为O(1) 空间性能 顺序存储结构需要预分配存储空间,分大了,容易造成空间浪费,分小了,容易发生溢出. 单链

Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结

Atitit.各种  数据类型 ( 树形结构,表形数据  ) 的结构与存储数据库 attilax  总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 java c# php ( Dic/Map      List    datatable ) 1 3. 数据库存储数据  1 4. 数据的表形显示( 多条记录 与单条记录 ) 2 5. ASP.NET 数据控件:GridView,DataList,Repeater ,DetailsView,FormVie

结构体指针之间和结构体之间的强制类型转换那些事

结构体指针的强制类型转换在链表的使用中是非常有用的一种方式: (比如我们有一条链表(我们知道每一个链表的节点都是一种结构体),而链表中的每一个节点又是某一个结构体中的成员, 我们就可以通过查询链表的节点,通过将节点强制转换为某个结构体,然后我们就可以方便的使用某个结构体的其他成员了). 那么结构体之间的强制转换又是基于什么的原理实现的呢?需要明白下面几点: 1.结构体声明如何内存的分布,  2.结构体指针声明结构体的首地址,  3.结构体成员声明该成员在结构体中的偏移地址 举个例子: typed