探讨:通过循环数组或者集合,插入数据库中没有的数据

【场景】

要将一组物品 As 放入盒子 Bs 中,如果盒子有该物品,则不把该物品放入盒子。

即,通过循环数组或者集合,插入数据库中没有的数据。

【业务分析】

经常会有初学者进行类似于如下的循环判断

for(A a : As){
    for(B b : Bs){
        if (B.equals(A)) {
            break;
        } else {
            insert(A)
        }
    }
}

这段代码存在如下问题:
1. 在判断 Bs 中是否有 a 时,会把 Bs 中的所有物品与 a 对比,此时只要 Bs 中有与 a 不相等的物品,就会把 a 插入到数据库。换句话说就是,Bs 中有多个与 a 不相等的物品,那么 a 将被多次插入到数据库中。
2. 如果 Bs 只有两个物品,那么你将很难从数据库中的数据发现这个问题。

而正确的逻辑判断应该是如下代码:

/**
* 声明一个标志,默认数据时可以插入数据库的
* 当出现相等的时候,将该标志设置为 false。
* 当不相等时,不对标志进行处理
* 循环完成后,再对标志进行判断,
* true,表示循环中没有相同的物品,可以插入
* false,表示循环中有相同的物品,不插入
*/
flag in = true
for(A a : As){
    for(B b : Bs){
        if (B.equals(A)) {
           in = false;
           break;
        }
    }
    if(in){
        insert(A)
    }
}

如果你有更优化的方案,请在评论区回复。欢迎大家指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值