2013-08-29 58 views
9

使用switch語句檢查變量是否大於某個數字的最佳方法是什麼?或者你建議使用if-else?我發現這樣一個例子:如何在switch語句中使用大於或等於

int i; 

if(var1>var2) i = 1; 
if(var1=var2 i = 0; 
if(var1<var2) i = -1; 

switch (i); 
{ 
    case -1: 
    do stuff; 
    break; 

    case 0: 
    do stuff; 
    break; 

    case 1: 
    do stuff; 
    break; 

} 

你能告訴新手關於在switch語句中使用「大於或等於」是什麼?

+5

我會說它會更清晰3#if' – SJuan76

+0

你最好用if-else –

+2

我不明白你爲什麼要使用switch語句,如果你已經有一個if語句。只要做到if語句,因爲邏輯已經存在 – Mattsjo

回答

17

不知道這是你在問什麼,但你可以這樣來做:

int var1; 
int var2; 

int signum = Long.signum((long)var1 - var2); 
switch(signum) { 
    case -1: break; 
    case 0: break; 
    case 1: break; 
} 
+2

這是非常短的代碼,但我不確定這對每個人(包括我自己)都是容易理解的。我認爲如果代碼很長一段時間會由很多人維護,那麼讓代碼易於閱讀就顯得尤爲重要。 – treeno

+1

+1使用開關,我已經更新了我的答案。感謝您指出了這一點。 –

+1

由於數值溢出的風險,不建議使用。找到該錯誤可能需要幾個小時。 – Holger

4

的Java只支持直接的價值,在case聲明沒有範圍,所以如果你必須使用一個開關,先映射到選項,然後打開選項,如您所提供的示例是您唯一的選擇。然而,這是非常過分的 - 只要使用if語句即可。

+0

基本上是這樣。但是在某些情況下(不是OP的情況),默認選項可用於有效支持範圍。 – emory

10

我強烈建議if(var1>var2){}else if (var1==var2) {} else {}構造。在這裏使用開關將隱藏意圖。那麼如果一個break被錯誤刪除?

對於枚舉值,開關非常有用且清晰,不用於比較。

6

第一個建議:switch,因爲它的狀態只能用於切換而不用於狀態檢查。

From JLS switch statements

SwitchStatement: 
    switch (Expression) SwitchBlock 

表達式轉換爲int或枚舉在表達式都支持。

這些標籤被說成與switch語句相關聯,如 是常量表達式(§15.28)或枚舉常數的值 (第8.9.1節)中的情況下的標籤。

在switch語句中只允許常量表達式和枚舉常量爲1.6或更低的Java 7字符串值也受支持。不支持邏輯表達式。

或者,您可以按照@Stewart在他的回答中所做的那樣做。

+0

如果'var1 == 6'和'var2 == 4',那麼'var1 - var2 == 2'不在'switch'中。根據我5分鐘前的回答,您需要使用'Integer.signum()'。 :) – Stewart

+0

而且對於signum,它仍然被破壞,因爲差異可能高於整數範圍,從而導致溢出和錯誤結果。 – Holger

0

如果一個變量的值被使用,使用開關。如果多個變量都在使用,則使用if。在你陳述的問題中,應該是if

3

switch語句用於在返回特定值時運行代碼,if then else允許您在一個語句中選擇一個值範圍。我建議做類似下面的(雖然我personnally喜歡Integer.signum方法),你應該想看看多範圍:

int i; 

if (var1 > var2) { 
    i = 1; 
} 
else if (var1 == var2) { 
    i = 0; 
} 
else { 
    i = -1; 
} 
0

可惜你不能這樣做,在java中。它可能在CoffeeScript或其他語言。

我會推薦使用if - else -statement通過移動你的「做東西」在額外的方法。這樣你就可以將你的if-else保存在一個清晰可讀的代碼中。

2

你最好用if聲明; switch的方法就不太清楚了,在這種情況下,您的switch方法客觀上是錯誤的The contract for Comparable#compareTo不需要返回-11,只是返回的int的值爲負值或正值。 compareTo返回-42完全合法,並且您的switch語句會丟失結果。

相關問題