2010-10-20 68 views
2

只是一個簡單的問題,比如說Car類擴展了HashMap(String,String)。要在for循環中使用break嗎?

1.

for (Car car : carList) { 
    if (car.isEmpty) { 
     break; 
    } 
    doSomething(); 
} 

2.

for (Car car : carList) { 
    if (!car.isEmpty) { 
     doSomethingElse(); 
    } 
} 

使上述2個比較好? 謝謝。

----編輯---- 對不起,我沒有說清楚我的觀點。

doSomething()方法實際上是在做不同的事情。 我已將它們更改爲doSomething()和doSometingElse()。

我的問題是,你會把所有的過程在一個if()?或者如果if()條件不滿足,則首先中斷循環。

謝謝。

+0

什麼是你想做?這兩個循環做不同的事情。第一個循環會在找到第一個空車後導致調用doSomething()。第二個循環爲每個非空車調用'doSomething()'。根據你需要做什麼,我可以推薦一個'while'循環或'for'循環。 – 2010-10-20 01:39:34

+1

「哪個更好」是主觀的,尤其是當上面的例子做不同的事情時...告訴我們你期望的結果是什麼,我們可以更好地決定哪個會滿足這個,因此「更好」 – MadMurf 2010-10-20 01:41:06

+0

對不起,我沒有說出我的觀點清楚,我已經編輯了帖子,謝謝 – Gnavvy 2010-10-20 01:45:06

回答

0

如果你的意思是「繼續」而不是「休息」,那麼我會說不使用繼續或休息更好。

這不是一個大問題,但像繼續,休息和返回等語句基本上都是goto語句,它們已經打扮了一下。他們並沒有得到一條線或轉到一個標籤,而是轉向了控制結構的頂部或底部 - 這使得程序員在追蹤它時必須考慮一下,這意味着浪費時間和更多的錯誤機會。

這不是什麼大不了的事情,很多時候這些結構實際上會澄清你的代碼,但是如果你有選擇,而且他們似乎基本上做了同樣的事情,那就不要在別處發送控制。

+0

謝謝比爾。我正在考慮休息,因爲它只是讓代碼更容易閱讀。 – Gnavvy 2010-10-20 01:49:57

+0

我認爲在這種情況下代碼更少可讀性比更多的代碼(使用break語句)更可讀。通過反轉條件並且不需要中斷/繼續,可以減少代碼。 – 2010-10-20 02:26:10

+0

@matt b實際上,「少代碼更具可讀性」是一種謬誤,除非你正在談論20行代碼。將一條緊湊的線條更改爲兩條或三條線將幾乎總是更具可讀性(當我每次看到「富有表現力」這個詞時,都會畏縮)。 – 2010-10-20 16:48:03

1

他們做了完全不同的事情。第一輛會在看到第一輛空車後停工。第二個版本將爲每輛非空車輛「做點事情」。我想,你可能想使用continue而不是break

8

他們做了完全不同的事情。只要條件成立,前者將停止迭代,而後者只會在條件爲假的迭代期間跳過處理。

首先將break更改爲continue將使它們以相同的方式工作。

+0

對不起,我沒有明確我的觀點,我編輯了這篇文章,謝謝 – Gnavvy 2010-10-20 01:43:59

+0

除了第二個調用dosomethingelse()前者稱dosomething()。 – Matt 2010-10-20 01:44:54

0

這兩個循環不會做同樣的事情

  1. 將終止循環第一次發現空車廂用的isEmpty第一空單後跳過任何汽車。如果將'break'更改爲'continue'

  2. 將會爲所有非空車輛做一些事情。

+0

謝謝你的回答。對不起,我沒有明確表達我的觀點,我已編輯帖子,謝謝 – Gnavvy 2010-10-20 01:46:38

0

取決於你想要做什麼,第一個循環將在條件滿足時立即結束,而第二個循環將通過所有散列映射進行迭代。

0

如果你想要基於汽車是否爲空的不同行爲,你可以使用if else語句。如果您想停止迭代carList,請使用break。

for (Car car : carList) { 
    if (car.isEmpty) { 
     doSomething(); 
    } 
    else { 
     doSomethingElse(); 
    } 
} 
0

正如大家都指出的那樣,break版本會提前退出。 答案取決於你想要做什麼。

如果你已經完成了你需要做的事情,那麼一旦你完成了就會發生。爲什麼要浪費CPU週期?另一方面,如果你必須通過整個名單dosomethingelse()然後不爆發。

你打算有兩個不同的命名函數嗎?或者他們都應該被稱爲dosomething()?

0

這是你在找什麼?

for (Car car : carList) { 
    if (car.isEmpty) { 
     doSomething(); 
    } 
    else { 
     doSomethingElse(); 
    }  
} 

或者,你在找

for (Car car : carList) { 
    if (car.isEmpty) { 
     break; 
     //STOP ITERATING THROUGH THE REST OF THE LIST 
     //(doSomething & soSomethingElse may have been called a few times already) 
    } 
    else { 
     doSomething(); 
    } 
    doSomethingElse(); 
} 

還有其他的選擇還有,你的澄清仍然是不明確......我反正...

+0

感謝MadMurf,你的回答是對的。我只是想將doSomethingElse()移出if()部分。 paxdiablo的評論中的帖子就是我正在尋找的內容。 – Gnavvy 2010-10-20 02:00:46