for循环双重循环 之坑

先奉上一段代码 大家看有没有问题

public class TestBackpressure {

    public static void main(String[] args) {
        List week = new ArrayList<>();
        week.add(new Week("周一", false, "1"));
        week.add(new Week("周二", false, "2"));
        week.add(new Week("周三", false, "3"));
        week.add(new Week("周四", false, "4"));
        week.add(new Week("周五", false, "5"));
        week.add(new Week("周六", false, "6"));
        week.add(new Week("周日", false, "7"));
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("3");
        list.add("5");
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < week.size(); j++) {
                Week week1 = (Week) week.get(j);
                System.out.println("TestBackpressure.main i->" + i + "j->" + j);
                if (list.get(i).equals(week1.getWeekNum())) {
                    week1.setCheck(true);
                    break;
                } else {
                    week1.setCheck(false);
                }
            }
        }
        for (int i = 0; i < week.size(); i++) {
            System.out.println("TestBackpressure.main" + ((Week) week.get(i)).isCheck());
        }
    }
}

这段代码要达到的目的就是将存在相同元素的model 更改状态为选中 同时跳出避免多次循环 不相同的为不选中 

开始我以为这样是没问题的但是 事实证明 打脸了。。

只改变最后一个list 中最后一个与week 存在相同元素model的值 

wtf -> 因为外部循环只循环list.size 内部循环week.size 问题来了 看输出结果

TestBackpressure.main->list->i->0->week->J->0->isCheck->true
TestBackpressure.main->list->i->1->week->J->0->isCheck->false
TestBackpressure.main->list->i->1->week->J->1->isCheck->false
TestBackpressure.main->list->i->1->week->J->2->isCheck->true
TestBackpressure.main->list->i->2->week->J->0->isCheck->false
TestBackpressure.main->list->i->2->week->J->1->isCheck->false
TestBackpressure.main->list->i->2->week->J->2->isCheck->false
TestBackpressure.main->list->i->2->week->J->3->isCheck->false
TestBackpressure.main->list->i->2->week->J->4->isCheck->true
TestBackpressure.mainfalse
TestBackpressure.mainfalse
TestBackpressure.mainfalse
TestBackpressure.mainfalse
TestBackpressure.maintrue
TestBackpressure.mainfalse
TestBackpressure.mainfalse

直关的看 list i=0 week j=0 变成了true 当list i=1 week j=0 时 又复写成了false 这是因为week 多次循环导致

week 会循环多次 与list中的某一项进行比较 所以值会复写多次并只变换list中最后项满足条件的数据

         当list  i=0   week j=0  此时list.get(0)  与week.get(0).getWeekNum() 是相同的 执行if week1.setCheck(true); break 第一个数据选中

         第一个看似没问题  好我们来看第二次

        当list  i=1  此时内层循环重新开始 week j=0  此时list.get(1) 与week.get(0).getWeekNum() 是不同的 执行else week1.setCheck(false); 继续循环  外层i 不变内层 i=1 值比较依然不同  执行else week2.setCheck(false).......

注意  看外层循环第二次 内层循环第二次的情况下 内层要改变的数据依然会重新循环 数据自然覆盖掉i=0时的值

重新赋值为i=1时候week 中model的值 一直到最后i=2 又会覆盖掉i=1 时 week 中model 的值 此时只保留最后 i=3 时week中model的值---->只保留最后一次 下面是输出结果 可以看到只有第五项是改了的 第一项和第三项是false

那我们怎么避免上面的问题呢

改变哪个数据集合中的值 就让哪个再外层循环 满足条件后break 跳出接着执行下一次循环

比如上面我们要改变的时week 中的值 那 外层循环 week.size  内层循环list.size  这样循环逻辑就变了

这样week 只循环一次 list循环多次 week.get(i) 随着i的值增加去 与list 中所有的数据进行比较当条件满足i+1 接着去和list中的数据比较 避免重复更改 week中的数据 这样就可以了。。。。虽然很简单 还是记一下

for (int i = 0; i < week.size(); i++) {
            for (int j = 0; j < list.size(); j++) {
                Week week1 = (Week) week.get(i);
                if (list.get(j).equals(week1.getWeekNum())) {
                    week1.setCheck(true);
                    System.out.println("TestBackpressure.main->" + "J->" + j + "isCheck->" + week1.isCheck());
                    break;
                } else {
                    week1.setCheck(false);
                    System.out.println("TestBackpressure.main->" + "J->" + j + "isCheck->" + week1.isCheck());
                }
            }
        }

输出结果可以看到要改的 第一三五项均已更改 观察i 与j的值 可以知道循环比较过程

TestBackpressure.main->week->i->0->list->J->0->isCheck->true
TestBackpressure.main->week->i->1->list->J->0->isCheck->false
TestBackpressure.main->week->i->1->list->J->1->isCheck->false
TestBackpressure.main->week->i->1->list->J->2->isCheck->false
TestBackpressure.main->week->i->2->list->J->0->isCheck->false
TestBackpressure.main->week->i->2->list->J->1->isCheck->true
TestBackpressure.main->week->i->3->list->J->0->isCheck->false
TestBackpressure.main->week->i->3->list->J->1->isCheck->false
TestBackpressure.main->week->i->3->list->J->2->isCheck->false
TestBackpressure.main->week->i->4->list->J->0->isCheck->false
TestBackpressure.main->week->i->4->list->J->1->isCheck->false
TestBackpressure.main->week->i->4->list->J->2->isCheck->true
TestBackpressure.main->week->i->5->list->J->0->isCheck->false
TestBackpressure.main->week->i->5->list->J->1->isCheck->false
TestBackpressure.main->week->i->5->list->J->2->isCheck->false
TestBackpressure.main->week->i->6->list->J->0->isCheck->false
TestBackpressure.main->week->i->6->list->J->1->isCheck->false
TestBackpressure.main->week->i->6->list->J->2->isCheck->false
TestBackpressure.maintrue
TestBackpressure.mainfalse
TestBackpressure.maintrue
TestBackpressure.mainfalse
TestBackpressure.maintrue
TestBackpressure.mainfalse
TestBackpressure.mainfalse

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值