2012-09-22 80 views
3

我正在使用Do While循環,但我必須測試該條件是否滿足循環的一半,以便如果滿足,它將跳過該部分。有沒有這樣做的有效方式?在do while循環中檢查條件的有效方法?

例如我目前有這樣的事情:

do { 
    method1; 
    if (!condition) 
     method2; 
} while (!condition); 

編輯:我道歉,我不認爲我首先明確表示。該條件開始爲false,並且在循環過程中的某個點,其中一個方法將(全局)「條件」設置爲true,我希望循環立即結束。我只是覺得不得不測試它內部循環的結束條件,並想知道是否有什麼明顯的我失蹤。

+0

什麼似乎是問題? –

+1

我假設你想離開while循環'if!condition'即使在循環的中間? –

+0

是的,這就是我想要做的,但從我可以看到,因爲循環是如此簡單添加一個「休息」;它會讓它變得更加複雜,因爲我還需要兩次測試條件。 – brent

回答

2

請提供有關方法的詳細信息。如果你可以從方法1/2返回的條件,然後嘗試:

do { 
    method1; 
} while (!condition && !method2) 

,或者如果您通過引用和方法返回傳遞總是正確的:

while (method1 && !condition && method2 && !condition); 

或:

while (!method1 && !method2); 

編輯:如果:

public boolean method1/2 { ... logic ... ; condition = true; return condition;} 

這幾乎不取決於你會做什麼。

+0

這看起來是最好的方式。由於它看起來並沒有任何有效的改進,所以我會讓這些方法返回一個布爾值,並且與第三個代碼段中的內容相似。謝謝! – brent

+1

返回布爾值的方法將導致災難,因爲如果方法返回錯誤的值,while循環將永遠運行。只要保持你的代碼簡單就是這樣。 –

0

如果condition是你提到它比

do { 
    method1; 
    method2; 
} while (!condition); 

在while循環中的所有地方一樣condition將永遠是假的(!condition將是真實的),除非你把它設置爲true method1;比你可以break;只要你把它設置爲true method1;

+0

那麼沒有其他選擇了嗎?在循環過程中,方法1或方法2中的條件可以設置爲true。我可以使用break;但由於循環的簡單性,它實際上幾乎與我一樣,即使不是更好,也是如此。但它看起來很亂,我張貼在這裏想知道是否有更好的方法 - 但它看起來不像它。 – brent

+1

我不認爲有。抱歉。 – 19greg96

0

如何代碼如下:

if(condition) 
break; 
+0

這是一種可能性,但如果我理解正確,它最終會添加一行代碼? – brent

+1

如果代碼是圖片中只有一個條件,那麼'method2'應該在循環之外。是的額外的代碼不會花費你任何東西。 –

0

你看這個:

while (!condition) { 
    method1; 
if(!condition) 
    method2; 
} 
+1

如果他在'method1'中將'condition'設置爲true會怎麼樣? 'method2'仍然會被訪問 – 19greg96

+0

這個想法在第一種方法或第二種方法中會最終在循環的某個時間將條件設置爲真。如果第一個方法將其設置爲true,我不想執行第二個方法,但必須循環兩個方法直到發生這種情況。 – brent

+1

我已編輯我的代碼,請查看一次 –

0

如何:

method1; 
while (!condition) { 
    method2; 
    method1; 
} 
+0

這與我最初的做法很相似,但如果method2將條件設置爲true,那麼程序將無法正常工作。 – brent

2

我假設你正在尋找的是避免這種額外的效率測試,因爲「條件」不符合大多數時間(多出1)... 這個優化可以通過更深入地瞭解什麼是真的在method1和method2(或者他們正在處理的數據)中完成,並在循環外部添加第一個「僞步」,這將僅在第一次禁用method2的處理。應該是這樣的:

prepare_for_loop_entering 
do { 
    method2 
    method1; 
} while (!condition); 
+0

謝謝,與Vikdor提出的解決方法相似。正如我提到的那樣,我在開始時確實有類似的代碼。循環內條件的測試是每次迭代都必須完成的,所以它不能解決問題。 – brent

0

使用循環中最通用的形式:

while (true) 
{ 
    method1; 
    if (!condition) break; 
    method2; 
} 

進一步解釋

while循環使用的條件 「條件」 是完全一樣:

while (true) 
{ 
    if (condition) break; 
    method1; 
    method2; 
} 

而且do-while完全是這樣的:

while (true) 
{ 
    method1; 
    method2; 
    if (condition) break; 
} 

我們既不希望這些,因此上面的代碼。