2015-11-17 63 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编译器优化 - 然而,在某些语言中,像这样的小实际实际上实现为决策树而不是跳转表,因为性能折衷非常小。 –