我刚开始学习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));
我知道这看起来很傻,而且我觉得这样做是个白痴。您有什么推荐的吗?我还没上课,所以任何解释都非常有用。感谢
答案 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);
}
}
答案 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(没有下划线)编写。这些只是风格约定,将帮助您创造良好的习惯。每种语言都有自己的约定,学习并使用它们。