可能重复:
If/Else vs. Switch
我这里有两个代码,我只想问两个中哪一个在可写性(编写代码的简易性)和可读性(易于理解代码)方面更好。
的switch-case:
import java.io.*;
public class Quarter{
public static void main(String[] args){
int day;
String input="";
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Input a number from 1 to 3: ");
try{
input=in.readLine();
}catch(IOException e){
System.out.println("Error!");
}
day=Integer.parseInt(input);
switch(day){
case 1:
case 2:
case 3:
System.out.println("1st Quarter");
break;
case 4:
case 5:
case 6:
System.out.println("2nd Quarter");
break;
case 7:
case 8:
case 9:
System.out.println("3rd Quarter");
break;
case 10:
case 11:
case 12:
System.out.println("4th Quarter");
break;
default: System.out.println("Error!");
}
}
}
如果 - 否则:
import java.io.*;
public class Days{
public static void main(String[] args){
int day;
String input="";
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Input a number from 1 to 12: ");
try{
input=in.readLine();
}catch(IOException e){
System.out.println("Error!");
}
day=Integer.parseInt(input);
if(day>=1 && day<=3){
System.out.println("1st Quarter");
}else
if(day>=4 && day<=6){
System.out.println("2nd Quarter");
}else
if(day>=7 && day<=9){
System.out.println("3rd Quarter");
}else
if(day>=10 && day<=12){
System.out.println("4th Quarter");
}else
System.out.println("Error!");
}
}
答案 0 :(得分:36)
我也不会这样做:
String[] out = {
"1st Quarter",
"2nd Quarter",
"3rd Quarter",
"4th Quarter"
};
if (1 <= day && day <= 12) {
System.out.println(out[(day - 1) / 3]);
} else {
System.out.println("Error!");
}
答案 1 :(得分:3)
您更喜欢哪一个?这是你的代码。
我绝对更喜欢开关盒,但是如果你有一些组合或者例如'大于'切换案例不是正确的做法。
另一件事:我会像下面这样写开关案例,因为我认为最好阅读:
switch(day){
case 1:
case 2:
case 3:
System.out.println("1st Quarter");
break;
...
}
HTH,Andreas
答案 2 :(得分:3)
首先避免逻辑分支。表查找通常是一种有用的技术。算术操作也很重要 - 在你关心的值中寻找一个模式,以及一个将它们转换成更简单的函数的函数。在更复杂的情况下也要考虑多态性。
如果您以相同的方式处理所有例外情况,请在同一地点进行处理。
范围变量尽可能紧密。
提示你真正想要的输入,FFS。 :)
import java.io.*;
public class Quarter {
public static void main(String[] args) {
try {
System.out.print("Input the month number (1 = January, 2 = February ... 12 = December): ");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int month = Integer.parseInt(in.readLine());
int quarter = (month - 1) / 3;
String[] quarters = new String[]{ "1st", "2nd", "3rd", "4th" };
System.out.println(quarters[quarter] + " Quarter");
} catch (Exception e) { // IOException for non-numeric, or AIOOBE for out of range
System.out.println("Error!");
}
}
}
答案 3 :(得分:2)
怎么样:
(day>=1 && day <=3) ? System.out.println("1st Quarter") :
(day >= 4 && day <= 6) ? System.out.println("2nd Quarter") :
(day >=7 && day <= 9) ? System.out.println("3rd Quarter") :
(day >= 10 && day <= 12) ? System.out.println("4th Quarter") : System.out.println("Error1");
)
你也可以这样做:
String val = (day>=1 && day <=3) ? "1st Quarter" :
(day >= 4 && day <= 6) ? "2nd Quarter" :
(day >=7 && day <= 9) ? "3rd Quarter" :
(day >= 10 && day <= 12) ? "4th Quarter" : "Error1";
System.out.println(val);
我认为要么应该有用。
答案 4 :(得分:2)
我不清楚问题是关于特定代码示例的解决方案,还是关于一般结构的问题。因此,if-else方法的一些优点需要考虑。
if-else在代码总体上更常见,因为数量 交换机接受的数据类型是有限的,交换机本身是有限的 编译时间值。更熟悉的可读性更好 更广泛的受众。
如果找到你的基本结构不会改变 需求发生变化,您需要支持不同的数据类型。 我不得不将枚举上的大量开关改为字符串比较 我有人添加了用户能够要求的时间 配置选项。
需要休息;正确的内部开关介绍 奇怪的错误的机会只出现在角落的情况下 交换机变得庞大而复杂。
当然我个人是企业程序员,我会创建一个timeUnitSubDivisionResolvingVisitor ... :)
答案 5 :(得分:2)
String[] suffix = new String[]{ "st", "nd", "rd", "th" };
System.out.println((1 <= day && day <= 12)?
String.format("%d%s Quarter", (day-1)/3+1, suffix[(day-1)/3]):
"Error!"
);
答案 6 :(得分:1)
实现它的另一种方法是通过Map。它会使它可配置,尤其是你正在使用Spring,你可以在bean.xml中设置这个Map变量,如果你决定的话。
无论如何这里是替代方案:
Map<Integer, String> m = new HashMap<Integer, String>();
m.put(1, "1st Quarter");
m.put(2, "1st Quarter");
m.put(3, "1st Quarter");
m.put(4, "2nd Quarter");
m.put(5, "2nd Quarter");
m.put(6, "2nd Quarter");
m.put(7, "3rd Quarter");
m.put(8, "3rd Quarter");
m.put(9, "3rd Quarter");
m.put(10, "4th Quarter");
m.put(11, "4th Quarter");
m.put(12, "4th Quarter");
System.out.println(m.get(d));