当然,需要终止循环,或者需要跳过其中一次迭代时,会在模型中用到break 或 continue 关键字。
然后接着尝试对嵌套循环做同样的事情,但是一切都变得混乱了,因为你会需要在多个地方添加这些关键字,具体取决于所需的结果。
通过标签可以控制我们想要中断/继续哪个循环。 下面让我们看一个例子。
想象一下,您有一个名为 Car 的智能体群,这辆汽车有很多零件,其中一些零件存在缺陷概率是随机的。 现在,机械师一次只能维修一辆车,所以你想把你发现的第一辆有缺陷的车发给他们。 为了找到第一辆至少有一个这些缺陷零件的汽车并将其发送给机械师,您可以编写如下代码:
boolean carFound = false;
for (Car car: cars) {
for (Part part: car.parts) {
if (part.isDefective()) {
carFound = true;
car.goToMechanic();
break;
}
}
if (carFound) break;
}
这里我们需要使用一个临时变量 carFound 来保存我们找到了一辆车,然后我们需要两个 break 语句来退出两个循环
注意:如果我们想完全退出这个函数,我们可以调用 return; 语句,它将退出整个函数。 但是我们假设在这个 for 循环下面还有一些其他的动作,我们也想在同一个函数中执行。
使用标签,您可以简单地在要控制的循环之前创建一个标签,并在找到有缺陷的零件时将其中断:
carLoop:
for (Car car: cars) {
for (Part part: car.parts) {
if (part.isDefective()) {
car.goToMechanic();
break carLoop;
}
}
}
因此,代码变得更加紧凑和可读。
同样的事情也可以用 continue 关键字。 现在让我们假设机械师有一个待修理的车队,我们现在想要将所有有缺陷的汽车发送给机械师。 但是在发车之前我们也想与供应商核实他们是否有缺陷零件的库存,如果我们发现某个缺陷零件,我们希望停止评估特定的汽车。
for (Car car: cars) {
for (Part part: car.parts) {
if (part.isDefective()) {
for (Supplier supplier:suppliers){
if (supplier.stockAvailable(part)) {
car.goToMechanic();
continue carLoop;
}
}
}
}
}
注意:如果您确实发现自己处于复杂的嵌套 for 循环中,这可能表明您需要将它们中的一些移动到不同的函数中,并将代码拆分为更小的可管理部分
您可以在此处下载alp文件
/uploads/editor/20220826/e6d37d8913a0d4bea81b311da951ef14.zip
或者从AnyLogic云中下载模型