Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对一个switch case语句使用两个值_Java_Switch Statement - Fatal编程技术网

Java 对一个switch case语句使用两个值

Java 对一个switch case语句使用两个值,java,switch-statement,Java,Switch Statement,在我的代码中,程序根据用户输入的文本执行某些操作。我的代码如下所示: switch (name) { case text1: { //blah break; } case text2: { //blah break; } case text3: { //blah break;

在我的代码中,程序根据用户输入的文本执行某些操作。我的代码如下所示:

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }
但是,案例
text1
text4
中的代码是相同的。因此,我想知道我是否有可能实现类似的功能

case text1||text4: {
            //blah
            break;
        }

我知道
|
运算符在case语句中不起作用,但是我可以使用类似的语句。

您可以使用两个
case
语句,如下所示

案例文本1:
案例文本4:{
//废话
打破
}
请参见此示例:代码示例计算特定月份的天数:

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

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if (((year % 4 == 0) && 
                     !(year % 100 == 0))
                     || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = "
                           + numDays);
    }
}
这是代码的输出:

天数=29天
漏洞:

另一个有趣的问题是break语句。每个中断语句 终止封闭的switch语句。控制流继续进行 开关块后面的第一条语句。中断语句 是必要的,因为没有它们,开关块
中的语句会下降
通过
:在中执行匹配案例标签后的所有语句 序列,无论后续大小写标签的表达式如何, 直到遇到break语句

示例代码:

公共类切换直通{
公共静态void main(字符串[]args){
java.util.ArrayList futureMonths=
新的java.util.ArrayList();
整月=8;
开关(月){
案例1:未来月份。添加(“一月”);
案例2:未来月份。添加(“二月”);
案例3:未来月份。添加(“三月”);
案例4:未来月份。添加(“四月”);
案例5:未来月份。添加(“五月”);
案例6:未来月份。添加(“6月”);
案例7:未来月份。添加(“7月”);
案例8:未来月份。添加(“8月”);
案例9:未来月份。添加(“9月”);
案例10:未来月份。添加(“10月”);
案例11:未来数月。添加(“11月”);
案例12:未来月份。添加(“12月”);
默认:中断;
}
if(futureMonths.isEmpty()){
System.out.println(“无效月号”);
}否则{
用于(字符串月份名称:未来月份){
系统输出打印项次(月名);
}
}
}
}
这是代码的输出:

8月
九月
十月
十一月
十二月
在switch语句中使用字符串

在JavaSE7和更高版本中,可以在交换机中使用String对象 语句的表达式。下面的代码示例, 根据字符串的值显示月份数 命名月份:

公共类StringSwitchDemo{
公共静态整数getMonthNumber(字符串月份){
int monthNumber=0;
如果(月==null){
返回月号;
}
开关(month.toLowerCase()){
“1月”案:
月数=1;
打破
“二月”案:
月数=2;
打破
“三月”案:
月数=3;
打破
“四月”案:
月数=4;
打破
“可能”一案:
月数=5;
打破
“6月”案:
月数=6;
打破
“7月”案:
月数=7;
打破
“八月”案:
月数=8;
打破
“9月”案:
月数=9;
打破
“10月”案:
月数=10;
打破
“11月”案:
月数=11;
打破
“12月”一案:
月数=12;
打破
违约:
月数=0;
打破
}
返回月号;
}
公共静态void main(字符串[]args){
字符串month=“八月”;
整数返回的月数=
StringSwitchDemo.getMonthNumber(月);
if(returnedMonthNumber==0){
系统输出打印项次(“无效月份”);
}否则{
System.out.println(返回的月数);
}
}
}
此代码的输出为8

您可以这样做:

case text1:
case text4: {
            //blah
            break;
}
照办

case text1: case text4: 
     do stuff;
     break;

case
值只是可以共享相同入口点的无代码“转到”点:

case text1:
case text4: 
    //blah
    break;

请注意,支架是多余的。

不需要支架。照办

case text1:
case text4:
  doSomethingHere();
  break;
case text2:
  doSomethingElse()
  break;

如果有人对此感到好奇,这被称为案例失误。这样做的能力是
中断的原因是结束案例语句所必需的。更多信息,请参阅维基百科文章。

其他人的
错误答案都是好答案

然而,另一种方法是从case语句的内容中提取方法,然后从每个case中调用适当的方法

在下面的示例中,案例“text1”和案例“text4”的行为相同:

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }

我个人认为这种编写案例语句的风格更易于维护,可读性也更高,尤其是当你调用的方法有很好的描述性名称时。

我觉得这种方法是最好的方法

case text1:
case text4: {
        //Yada yada
        break;
} 

案例值只是可以共享相同入口点的无代码“转到”点:

case text1:
case text4: 
    //blah
    break;
案例文本1:
案例文本4:{
//做点什么
中断;
}

请注意,大括号是多余的。

随着JDK-12早期访问版本中的集成,现在可以使用交换机标签的新形式,如下所示:-

case text1, text4 -> {
     //blah
} 
或者重新表述演示,类似于:-

public class RephraseDemo {

    public static void main(String[] args) {
        int month = 9;
        int year = 2018;
        int numDays = 0;

        switch (month) {
            case 1, 3, 5, 7, 8, 10, 12 ->{
                numDays = 31;
            }
            case 4, 6, 9, 11 ->{
                numDays = 30;
            }
            case 2 ->{
                if (((year % 4 == 0) &&
                        !(year % 100 == 0))
                        || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
            }
            default ->{
                System.out.println("Invalid month.");

            }
        }
        System.out.println("Number of Days = " + numDays);
    }
}
以下是您可以尝试的方法-

您可以使用:

case text1: case text4: 
     do stuff;
     break;
在JDK-13和JDK-14中
String text = switch (name) {
    case text1, text4 -> "hello" ;
    case text2, text3, text5 -> "world" ;
    default -> "goodbye";
};
String text = switch (name) {
    case text1, text4 ->
        yield "hello";
    case text2, text3, text5 ->
        yield "world";
    default ->
        yield "goodbye";
};