光电数鸡算法《java》

一:需求

题目:一条流水线有工位D1,D2,D3...D20,总共20个工位。

每个工位都装有一个光电计数器,每个工位都为本工位的计数减去前一个工位(第一个有数值的工位除外,不计算。)

计算规则:比如D1,D2都有数值,D2计数等于D2-D1为,D1不计算,以此类推。

现在数据库中存着这些工位计数的明细数据,要求从数据库中查出当天每个工位的光电计数值,并求出每个工位具体的计数值。
注意 :D1到D20,20是个工位中有可能有的工位没有数值,数据库明细中没有记录。如数据:D1数值20,D2为80,剩余数据没有了(数据库明细中只有这两个数据)。

解释:数据D1为80,D2为100,D2后面所有工位为空,那么计算后,D1计数值为80,D2为100-80=20,如果哪个工位为空,不再计算,直接为0。

二:代码解答

注意:下面是测试代码,各位看看就好
这个是测试代码:

java 复制代码
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

    public class GoodIntegers {
        public static void countWholeDayPairs(List<ShStatisticsDetails> list) {

            Map<String, Integer> countsMap = new HashMap<>();
            for (int i = 0; i < list.size() ; i++) {
                ShStatisticsDetails rs = list.get(i);
                countsMap.put(rs.getWorkStation(), rs.getChickenNum());
            }

            int[] actualCounts = new int[20];
            int previousCount = 0;
            for (int i = 0; i < 20; i++) {
                String currentStation = "D" + (i + 1);
                int currentCount = countsMap.getOrDefault(currentStation, 0);
                if (i == 0) {
                    actualCounts[i] = currentCount;  
                } else {
                    if (currentCount != 0 || countsMap.containsKey(currentStation)) {
                        actualCounts[i] = currentCount - previousCount;
                        previousCount = currentCount;
                    } else {
                        actualCounts[i] = 0;  
                    }
                }
            }
            for (int i = 0; i < 20; i++) {
                System.out.println("D" + (i + 1) + ": " + actualCounts[i]);
            }
        }

        public static void main(String[] args) {
            List<ShStatisticsDetails> list = new LinkedList<>();
            //创建对象,依次放入D1,D2还有数值
            ShStatisticsDetails s1 = new ShStatisticsDetails();
            s1.setWorkStation("D2");
            s1.setChickenNum(80);
            list.add(s1);

            ShStatisticsDetails s2 = new ShStatisticsDetails();
            s2.setWorkStation("D3");
            s2.setChickenNum(100);
            list.add(s2);


            ShStatisticsDetails s3 = new ShStatisticsDetails();
            s3.setWorkStation("D12");
            s3.setChickenNum(220);
            list.add(s3);


            ShStatisticsDetails s4 = new ShStatisticsDetails();
            s4.setWorkStation("D18");
            s4.setChickenNum(260);
            list.add(s4);

            ShStatisticsDetails s5 = new ShStatisticsDetails();
            s5.setWorkStation("D6");
            s5.setChickenNum(120);
            list.add(s5);
          countWholeDayPairs(list);
        }
    }

用的ShStatisticsDetails实体类:

java 复制代码
public class ShStatisticsDetails
{
    private static final long serialVersionUID = 1L;

    /** 机器号 */
    @Excel(name = "机器号")
    private String machineNumber;

    /** 工位 */
    @Excel(name = "工位")
    private String workStation;

    /** 统计数鸡数量(明细) */
    @Excel(name = "统计数鸡数量", readConverterExp = "明=细")
    private Integer chickenNum;
    }

结果

java 复制代码
D1: 0
D2: 80
D3: 20
D4: 0
D5: 0
D6: 20
D7: 0
D8: 0
D9: 0
D10: 0
D11: 0
D12: 100
D13: 0
D14: 0
D15: 0
D16: 0
D17: 0
D18: 40
D19: 0
D20: 0

解析:

(1)将查询结果(也就是上面的list集合数据)存储在一个Map中,工位为map的key,光电计数为value,以便后续处理。

如果某个工位没有数据,使用getOrDefault方法给出默认值0。

(2)计算每个工位的实际计数:遍历所有工位,计算每个工位的实际计数。

如果当前工位为第一个,则直接使用其计数值;

否则,计算当前工位与前一个工位的差值。如果某个工位的数据缺失,则设置该工位的计数值为0。
总结:

总体而言并不算太难,加油!

相关推荐
JiKun几秒前
一键配置 Web 前端开发环境(PowerShell 自动化脚本)
前端·windows·程序员
yuuki2332336 分钟前
【C语言】预处理详解
c语言·windows·后端
peiwang2458 分钟前
Linux系统中CoreDump的生成与调试
java·linux·开发语言
DuHz8 分钟前
频率分集阵列雷达——论文阅读
论文阅读·算法·汽车·信息与通信·毫米波雷达
顾漂亮12 分钟前
Redis深度探索
java·redis·后端·spring·缓存
努力也学不会java12 分钟前
【Spring】Spring事务和事务传播机制
java·开发语言·人工智能·spring boot·后端·spring
机器学习之心13 分钟前
198种组合算法+优化RF随机森林+SHAP分析+新数据预测!机器学习可解释分析,强烈安利,粉丝必备!
算法·随机森林·机器学习·shap分析·198种组合算法
hookserver24 分钟前
企业微信聚合应用系统,ipad协议接口
java·http·微信·企业微信·ipad
学习编程的Kitty42 分钟前
JavaEE初阶——多线程(2)线程的使用
java·开发语言·java-ee