2015-11-17 60 views
-3

已回答如何減少這裏使用的「if」語句的數量?

感謝您的幫助!

我正在爲我的AP計算機科學類的一些代碼工作,我想知道是否有更有效的方法來做到這一點。該方法非常長且冗餘。解釋旁邊我可以做出的改進將不勝感激!

public void setColor(){ 

    if(sequenceNum == 0){ 
     myColor = Color.RED; 
    } 
    if(sequenceNum == 1){ 
     myColor = Color.ORANGE; 
    } 
    if(sequenceNum == 2){ 
     myColor = Color.YELLOW; 
    } 
    if(sequenceNum == 3){ 
     myColor = Color.GREEN; 
    } 
    if(sequenceNum == 4){ 
     myColor = Color.BLUE; 
    } 
    if(sequenceNum == 5){ 
     myColor = Color.MAGENTA; 
    } 

} 
+2

在進入這樣的網站之前,你應該學會自己解決這樣的簡單問題。它的字面意思就像用谷歌搜索你的問題一樣簡單 – redFIVE

+0

我認爲這應該在代碼審查,而不是SO? –

+0

@MikeAgustin,不需要轉移它,因爲它在這裏得到了很好的答案。在[Codereview.se]中,這實際上可以作爲存根代碼關閉。請閱讀[Stack Overflow用戶代碼評論指南](http://meta.codereview.stackexchange。com/questions/5777/a-guide-to-code-review-for-stack-overflow-users) – holroy

回答

0

switch

switch (sequenceNum) { 

case 0: 
    // Do something 
    break; 

case 1: 
    // Do something else 
    break; 

default: 
    // Do a default something 
    break; 
} 
3

你可以做

Color[] colors = {Color.RED, Color.ORANGE, Color.YELLOW...}; 
myColor = colors[sequenceNum]; 
0
public void setColor(){ 
    switch(sequenceNum){ 
    case 0: 
     myColor = Color.RED; 
     break; 
    case 1: 
     myColor = Color.ORANGE; 
     break; 
    case 2: 
     myColor = Color.YELLOW; 
     break; 
    case 3: 
     myColor = Color.GREEN; 
     break; 
    case 4: 
     myColor = Color.BLUE; 
     break; 
    case 5: 
     myColor = Color.MAGENTA; 
     break; 
    } 
} 

但是,這也是醜陋由Reimeus提供的答案是方式更優雅的只是確保你檢查0 < = sequenceNum < 5,避免受到arrayoutofboundsexception。我猜你正在學習,所以你應該檢查維基有用的資源:https://stackoverflow.com/tags/java/info。和Javadoc來控制流的更多信息:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html

好運

5

switch語句是一個想法,但如果序列號是密集的,我會用一個查找表:

final Color[] myColors = {Color.RED, Color.ORANGE, Color.YELLOW, ...}; 

myColor = myColors[sequenceNum]; 

當然,在經過範圍檢查sequenceNum之後。

請注意,您的原始代碼在每個if之前應該有else,第一個除外。在比賽結束後重新測試沒有意義。

1
public static Color[] MAP_SEQNUM_TO_COLOR = { 
    Color.RED, 
    Color.ORANGE, 
    Color.YELLOW, 
    Color.GREEN, 
    Color.BLUE, 
    Color.MAGENTA 
}; 

public void setColor(){ 
    if((0 <= sequenceNum) && (sequenceNum <= 5)) { 
    myColor = MAP_SEQNUM_TO_COLOR[sequenceNum]; 
    } 
} 

免責聲明:沒有測試,更好地把它當作僞代碼。儘管如此,我在C#領域比Java更積極,但這個想法應該很清楚。

-1

如果通過「減少」如果「語句」的含義是字面意思,那麼您可以使用開關,但這相當於代碼運行時執行的類似測試序列。另一方面,如果你真的想要減少測試的數量,一個更清潔的解決方案就是使用一個數組(如其他人已經建議的那樣),特別是因爲你的示例代碼暗示着每種顏色都與一個唯一的整數。

+1

使用開關並不等於代碼運行時執行的類似測試序列。這是這種情況下的單一索引跳轉。 – EJP

+0

@EJP當然,如果有人知道它是如何在字節碼中進行優化的。從一般意義上講,它是表達不同案件結果的一種方式。但是,我們採取了一些措施,實際上這並不等於這一點。 – madanasta

+0

@EJP - 在這樣的小例子中,這可能並非如此。我不熟悉Java編譯器優化 - 然而,在某些語言中,像這樣的小實際實際上實現爲決策樹而不是跳轉表,因爲性能折衷非常小。 –