2014-05-14 21 views
0
if (i <= 33) { 
      variable = x; 
     } else if (i > 33 && i <= 66) { 
      variable = y; 
     } else { 
      variable = z; 
     } 

有沒有辦法縮短這一點?在這種情況下,我找不到如何使用三元運算符。有沒有辦法縮短這段代碼?也許是一個三元的表達?

+0

什麼數據類型是'我',你可以給範圍的任何限制?我想你可以做一些像'variable = {x,y,z} [i/33]' – MickLH

+0

我是一個int,範圍從0到100 – user3610410

+0

我會刪除'i> 33 &&'單獨。如果它仍然「太複雜」,只需將其隱藏在一個方法中 - 那麼它是一個單行調用:'variable = toNearestSegment(i);'。 – user2864740

回答

9

如果你想使用一些瘋狂的嵌套ternaries:

int variable = i <= 33 ? x : i > 33 && i <= 66 ? y : z 

...但不這樣做。改變你的代碼的可讀性和可維護性!

此外,作爲@EJP提到in his answer(你應該因此給予好評),該i > 33條件是多餘的,所以你可以縮短這:

int variable = i <= 33 ? x : i <= 66 ? y : z 

我只是抓住了條款從您的if/else直接。

+8

+1'但是不要這樣做。' –

+0

@JonathonReinhart我在我的製作環境中看到過這樣的代碼。調試並不好玩。 :) – asteri

+0

如果你必須設置一個斷點,你不能在三元組上做到這一點。 – vkg

0

您可以通過反轉比較方向,而不三元操作簡化:

if (i > 66) 
{ 
    variable = z; 
} 
else if (i > 33) 
{ 
    variable = y; 
} 
else 
{ 
    variable = x; 
} 

但正如其他人指出,可以簡化比較條件無方向反轉。

+1

您可以但不必扭轉方向,如[EJP顯示](http://stackoverflow.com/a/23644807/119527)。 –

+0

我沒有說你必須扭轉。這只是一種方式:) –

+0

但它是你提到的唯一方法。 – EJP

0

您可以使用ternery運營商,如:

if (i <= 33) { 
     variable = x; 
    } else { 
     variable = (i <= 66) ? y : z; 
    } 

但我認爲這是比你有什麼更糟糕。

注意,是因爲它已經被else

3
if (i <= 33) { 
     variable = x; 

暗示此時ii > 33可以被刪除是<= 33.

} else if (i > 33 && i <= 66) { 

在這一點上,我們是在「其他」,其中i > 33由施工,所以你不需要再次測試。

 variable = y; 
    } else { 
     variable = z; 
    } 

所以,你可以這樣減少:由於您使用的是else子句

if (i <= 33) { 
     variable = x; 
    } else if (i <= 66) { 
     variable = y; 
    } else { 
     variable = z; 
    } 
+1

關於'> 33'多餘的好處。 +1 – asteri

-1

,你不必對證33兩次:

if (i <= 33) { 
    variable = x; 
} else if (i <= 66) { 
    variable = y; 
} else { 
    variable = z; 
} 
+2

冗餘。 [EJP的答案](http://stackoverflow.com/a/23644807/119527)已經證明了這一點。 –

+0

@JonathonReinhart當我發佈時,EJP的回答是不可見的。 –

+0

它*是*,但您的頁面沒有刷新。時間戳不會說謊。 –

1
if (i <= 33) variable = x; 
    else if (i <= 66) variable = y; 
    else variable = z; 

由於每個子句只有一個語句,因此可省略大括號,並將語句帶到該子句的同一行。

0

如果存儲xy,並且z在數組中,你可以使用劃分來訪問陣列,這將是更快,特別是如果你知道你的病情爲界,在此情況下的不同元素,0和100。

index = Math.min(Math.max((i-1)/33, 0), 2); 
variable = x[index]; 

如果i不能小於0或大於100,這將成爲:

index = (i-1)/33; 
variable = x[index]; 
1

授予可理解你可以先解壓縮到一個方法,那麼: *使用第一個答案 *如果你想讓它更可以理解的,你可以做到這一點

private Object valuePerState(int i){ 
    if (i<33) return x; 
    if (i>66) return y; 
    return z; 
} 

BTW一步縮短您的問題是削減唐e測試33你完成扭曲

0

我似乎遲到了派對,但無論如何。這是我使用鏈式三元運算符的方式。在我看來這是相當可讀的。

variable = i <= 33 ? x 
     : i <= 66 ? y 
     : z ; 

由於運營商和空白的位置,這種方法也與版本控制效果很好:你在中間堅持任何新的條件簡直就是在差異中新行,留下其他條件不變。另外,如果有那麼多的操作員讓你感到緊張,你當然可以在條件中加上括號。

相關問題