當然,需要終止循環,或者需要跳過其中一次迭代時,會在模型中用到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云中下載模型
![]() |
電話:010-62964229 | |
![]() |
郵箱:support@carila.cn | |
![]() |
地址:北京市海淀區上地信息產業基地三街3號樓1門4層401 |