先奉上一段代码 大家看有没有问题
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 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