Java中有很多If条件

时间:2014-07-01 15:20:22

标签: java

我刚开始学习java并且有一个非常基本的问题。我有一个标签,我希望在1到18之间的随机整数落在特定数字上时更改颜色。这些数字不是奇数或偶数,所以我无法使用它。

现在我有这个:

    if (Random == 1 || Random == 2 || Random == 5 || Random == 7 || Random == 12 || Random == 14 || Random == 16 || Random == 18)  
        label_number.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
    else if (Random == 3 || Random == 4 || Random == 6 || Random == 8 || || Random == 9 | Random == 10 || Random == 11 || Random == 13 || Random == 15 || Random == 17)
        label_wheelNumber.setForeground(SWTResourceManager.getColor(SWT.COLOR_GREEN));

我知道这看起来很傻,而且我觉得这样做是个白痴。您有什么推荐的吗?我还没上课,所以任何解释都非常有用。感谢

9 个答案:

答案 0 :(得分:10)

这是一个开关的例子: 注意break;使用开关时,情况会失败。基本上,案例1:将进入下一个代码块。例如,在我的代码中,在第5种情况下:如果break;不在那里,它将落到下一个代码块,最后调用包含SWT.COLOR_GREEN的第二个代码块。< / p>

switch(Random)
{
    case 1:
    case 2:
    case 5:
        label_number.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
        break;
    case 9:
    case 10:
        label_wheelNumber.setForeground(SWTResourceManager.getColor(SWT.COLOR_GREEN));
        break;
}

答案 1 :(得分:9)

您可以使用switch

switch(Random) {
    case 1: case 2: case 5: case 7: case 12: case 14: case 16: case 18:
        //something...
        break;
    case 3: case 4: case 6: case 8: case 9: case 10: case 11: case 13: case 15: case 17:
        //something...
        break;
    default: 
        //just in case none of the over values was selected
}

如果值可能快速变化或您想要允许更多值,则可以将它们存储在数组或类似数据中:

static final int[] FOREGROUND_BLUE = {1, 2, 5, 7, 12, 14, 16, 18};
static final int[] FOREGROUND_GREEN = {3, 4, 6, 8, 9, 10, 11, 13, 15, 17};

然后执行搜索以查找值是否属于指定的数组:

//using binary search since the data in the array is already sorted
int found = Arrays.binarySearch(FOREGROUND_BLUE, Random);
if (found >= 0) {
    //something...
}
found = Arrays.binarySearch(FOREGROUND_GREEN, Random);
if (found >= 0) {
    //something...
} else {
    //...
}

如果您甚至可以拥有更多选项,可能您希望使用类似缓存的方法并将数据存储在Map<Integer, Color>中:

static final Map<Integer, Color> colorMap;
static {
    Map<Integer, Color> colorMapData = new HashMap<Integer, Color>();
    Color blue = SWTResourceManager.getColor(SWT.COLOR_BLUE);
    Color green = SWTResourceManager.getColor(SWT.COLOR_GREEN);
    colorMapData.put(1, blue);
    colorMapData.put(2, blue);
    colorMapData.put(3, green);
    colorMapData.put(4, green);
    colorMapData.put(5, blue);
    //...
    //this makes colorMap truly constant and its values cannot be modified
    colorMap = Collections.unmodifiableMap(colorMapData);
}

然后你只需要调用map中的值:

Color = colorMap.get(Random);

答案 2 :(得分:1)

使用Switch语句:

public class SwitchDemo {
   public static void main(String[] args) {

    int month = 8;
    String monthString;
    switch (month) {
        case 1:  monthString = "January";
                 break;
        case 2:  monthString = "February";
                 break;
        case 3:  monthString = "March";
                 break;
        case 4:  monthString = "April";
                 break;
        case 5:  monthString = "May";
                 break;
        case 6:  monthString = "June";
                 break;
        case 7:  monthString = "July";
                 break;
        case 8:  monthString = "August";
                 break;
        case 9:  monthString = "September";
                 break;
        case 10: monthString = "October";
                 break;
        case 11: monthString = "November";
                 break;
        case 12: monthString = "December";
                 break;
        default: monthString = "Invalid month";
                 break;
    }
    System.out.println(monthString);
}
}

取自:Oracle's Java Tutorial.

答案 3 :(得分:1)

可能有更好的选择,具体取决于Random的来源以及发生的上下文,但是您必须使用不同的语法基本相同的一个选项是:

switch(Random) {
    case 1:
    case 2:
    case 5:
    case 7:
    case 12:
    case 14:
    case 16:
    case 18:
        label_number.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
        break;
    case 3:
    case 4:
    case 6:
    case 8:
    case 9:
    case 10:
    case 11:
    case 13:
    case 15:
    case 17:
        label_wheelNumber.setForeground(SWTResourceManager.getColor(SWT.COLOR_GREEN));
        break;
}

这只是略微好于你所拥有的,但我认为至少要容易看一下。

答案 4 :(得分:1)

如果使用地图,您可以将其转换为单行(完全取消if / switch)。

HashMap<Integer, Color> mp = new HashMap<Integer, Color>();

mp.put(1, SWT.COLOR_BLUE);
mp.put(2, SWT.COLOR_BLUE);
...
mp.put(18, SWT.COLOR_BLUE);

mp.put(3, SWT.COLOR_GREEN);
mp.put(4, SWT.COLOR_GREEN);
...
mp.put(17, SWT.COLOR_GREEN);


...

label_number.setForeground(SWTResourceManager.getColor(mp.get(Random)));

此外,以不同的方式命名您的Random变量,因为它与Java API中的类名冲突。

答案 5 :(得分:1)

使用查找列表:

int[] ALLOW_BLUE = {1,2,5,7,12,14,16,18};
int[] ALLOW_GREEN = {3,4,6,8,9,10,11,13,15,17};

     if(Arrays.asList(ALLOW_BLUE).contains(random){
        label_number.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
     }
else if(Arrays.asList(ALLOW_GREEN).contains(random){
        label_number.setForeground(SWTResourceManager.getColor(SWT.COLOR_GREEN));
     }

答案 6 :(得分:1)

切换案例会做,但你能做的另一种方式是

int[] blueArray ={1,2,5,7,12,14,16,18};

if(Utils.arrayContain(blueArray,Random)){//your  util method
       label_number.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
}elseif(){
}

在数组中获取可能的值,然后选中Random是否存在该值。

答案 7 :(得分:0)

更优雅的方法是将每组数字放在ArrayList中,然后使用contains()方法检查数组中是否包含随机数:

if(Arrays.asList(new Integer[]{1, 2, 5, 7, 12, 14, 16, 18}).contains(Random )) {
    label_number.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
} else if (Arrays.asList(new Integer[]{3, 4, 6, 8, 9, 10, 11, 13, 15, 17}).contains(Random)) {
    label_wheelNumber.setForeground(SWTResourceManager.getColor(SWT.COLOR_GREEN));
}

对于性能问题,您还可以单独声明和存储这些数组,而不是每次要进行比较时动态创建它们。

答案 8 :(得分:0)

对于无法使用开关但仍有一些复杂条件需要评估的情况,您可以使用&#34;解释变量&#34;

// before
if ( a && b || c != d && e > f && g < h && h == 1 ) { 
   doSomething();
} else if ( i && j || etc ) {
   doSomethingElse();
}

//after with a variable
boolean shouldDoSomething = a && b || c != d && e > f && g < h && h == 1;
if ( shuoldDoSomething ) { 
   doSomething();
} else if ( i && j || etc ) {
   doSomethingElse();
}

或者创建一个评估条件的方法:

// after with a method 
if ( shouldDoSomething(a,b,c,d,e,f,g,h) ) { 
   doSomething();
} else if ( shouldDoSomethingElse(i, j, etc ))  {
   doSomethingElse();
}
...
private boolean shouldDoSomething( boolean a,boolean b,int c,int d,int e,int f,int g,int h) {
    return a && b || c != d && e > f && g < h && h == 1;
}
private boolean shouldSoSomethingElse(boolean i, boolean j, boolean etc ) {
    return i && j || etc;
}

目标是简化代码,使您能够更好地理解代码,并且更容易修改容易出错的代码。如果使用变量或创建方法更令人困惑,那么继续简单的评估。您还可以将三者结合起来:

//
boolean shouldDoX = a || b; 
if  ( shouldDoX || e != d && inRange(f, g, h ) ) {
  doSomething();
} 

同样,目标是使其更容易维护。

在这个例子中变量是a,b,c但是在实际代码中你应该使用一个简短的有意义的变量名

if ( inRange(random) ) { 
    label_number.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
} else if ( outOfRange(random)) { 
    label_wheelNumber.setForeground(SWTResourceManager.getColor(SWT.COLOR_GREEN));
}  

...
private boolean inRange(int random ) {
   // use switch or simple return random == 1 || random == 2 etc. 
}

此外,关于风格的最终说明:即使它们是一条线并且保持开口支撑在同一条线上,也要始终在你的if上使用大括号。在Java中,变量以小写开头,并以camelStyle(没有下划线)编写。这些只是风格约定,将帮助您创造良好的习惯。每种语言都有自己的约定,学习并使用它们。