하나의 스위치 케이스 명령문에 두 개의 값 사용


295

내 코드에서 프로그램은 사용자가 입력 한 텍스트에 따라 무언가를 수행합니다. 내 코드는 다음과 같습니다

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }

그러나 코드 내부의 경우 text1text4동일합니다. 따라서 다음과 같은 것을 구현할 수 있는지 궁금합니다.

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

나는 알고 ||작업자가 case 문에없는 일이지만 비슷한 뭔가 내가 사용할 수 있습니다 것입니다.


32
기본적인 질문은 그것이 널리 유용한 복제품이 아닌 경우 공감에 더 적합한 대상이 될 수 있는지 여부를 결정합니다. 그리고 가능한 한 나에게 일어나지 않았지만 이제는 그것이 눈에 띄게 명백하다는 것을 깨달았습니다. 전부 그래서 꽤 멋진 Q & A
리처드 설렘

1
@RichardTingle - 당신은 더프의 장치에 익숙 - en.wikipedia.org/wiki/Duff%27s_device
user93353

4
"왜 그렇게 많은 투표가 필요한가? 인터넷에서"자바 스위치 "를 검색하고 수천 가지 설명 중 하나를 읽으십시오." <-내가 뭘했다고 생각하니?
Brendan

4
나는 문자 그대로 "한 줄의 java에서 여러 사례"를 검색했으며이 Q & A가 첫 번째 결과였습니다.
domenix

1
JDK-12가 JEP-325를 통합 했으므로 선택한 답변의 스위치 데모를 다시 표현할 수 있습니다 . :)
Naman

답변:


555

CASE다음과 같이 두 가지 진술을 모두 사용할 수 있습니다 .

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

이 예 참조 : 코드 예는 특정 달의 일 수를 계산합니다.

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);
    }
}

이것은 코드의 출력입니다.

Number of Days = 29

실패로 끝나다:

또 다른 관심 지점은 브레이크 선언입니다. 각 break 문은 둘러싸는 switch 문을 종료합니다. 제어 흐름은 스위치 블록 다음에 오는 첫 번째 명령문으로 계속됩니다. 스위치 블록에 명령문이 없으면 break 문이 필요 fall through합니다. 일치하는 case 레이블 뒤의 모든 명령문은 break case가 나타날 때까지 후속 케이스 레이블의 표현식에 관계없이 순서대로 실행됩니다.

예제 코드 :

public class SwitchFallThrough {

    public static void main(String[] args) {
        java.util.ArrayList<String> futureMonths =
            new java.util.ArrayList<String>();

        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            case 3:  futureMonths.add("March");
            case 4:  futureMonths.add("April");
            case 5:  futureMonths.add("May");
            case 6:  futureMonths.add("June");
            case 7:  futureMonths.add("July");
            case 8:  futureMonths.add("August");
            case 9:  futureMonths.add("September");
            case 10: futureMonths.add("October");
            case 11: futureMonths.add("November");
            case 12: futureMonths.add("December");
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}

이것은 코드의 출력입니다.

August
September
October
November
December

스위치 명령문에서 문자열 사용

Java SE 7 이상에서는 switch 문의 표현식에 String 객체를 사용할 수 있습니다. 다음 코드 예제는 month라는 문자열 값을 기준으로 월 수를 표시합니다.

public class StringSwitchDemo {

    public static int getMonthNumber(String month) {

        int monthNumber = 0;

        if (month == null) {
            return monthNumber;
        }

        switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;
            case "may":
                monthNumber = 5;
                break;
            case "june":
                monthNumber = 6;
                break;
            case "july":
                monthNumber = 7;
                break;
            case "august":
                monthNumber = 8;
                break;
            case "september":
                monthNumber = 9;
                break;
            case "october":
                monthNumber = 10;
                break;
            case "november":
                monthNumber = 11;
                break;
            case "december":
                monthNumber = 12;
                break;
            default: 
                monthNumber = 0;
                break;
        }

        return monthNumber;
    }

    public static void main(String[] args) {

        String month = "August";

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(month);

        if (returnedMonthNumber == 0) {
            System.out.println("Invalid month");
        } else {
            System.out.println(returnedMonthNumber);
        }
    }
}

이 코드의 출력은 8입니다.

자바 문서에서


오 그래. 그것은 쉽다. 내가 그것을 할 수있는 줄 몰랐다
Ankush

18
이 언어 기능을 오류라고합니다. 없는 케이스 break는 기본적으로 다음 케이스 블록이 추가되어 시각적으로 아래에 있으므로 넘어 집니다.
오리온 황제

5
@ Kobor42는 먼저 공개 사이트에서 대화하는 방법을 배웁니다 제안이 도움이되는 방법 감사합니다
PSR

1
@ Kobor42 방법 : 왜 그 형식을 사용 했습니까? 대소 문자를 구분하면 코드를 쉽게 읽을 수 없으며 일반적으로 나쁜 관행으로 간주됩니다 [참조는 선택 사항이지만 원하는 항목]. 저는 항상 switch 문이 특히 읽을 수있는 형식이라고 생각했지만 이런 식으로 표시하면 모든 것을 잃습니다.
Richard Tingle

2
JDK-12가 JEP-325를 통합 했으므로 스위치 데모를 다시 설명 할 수 있습니다 . :)
Naman


27

case값은있는 동일한 항목 포인트를 공유 할 수 있습니다 "고토"포인트 코드없는 :

case text1:
case text4: 
    //blah
    break;

중괄호는 중복입니다.


@trig lol. 나는 최근에 아이폰 엄지 입력을 비난하는 그런 종류의 일을하고 있습니다. 건배
보헤미안

21

그냥 해

case text1: case text4: 
     do stuff;
     break;

15

JDK-12 초기 액세스 빌드에서 JEP 325 : Switch Expressions (Preview) 의 통합으로 이제 새로운 형식의 스위치 레이블을 다음과 같이 사용할 수 있습니다.

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);
    }
}

- 여기 당신이 그것을 시도 줄 수있는 방법입니다 메이븐과 함께 컴파일시 JDK12 미리보기 기능을


6

괄호는 불필요합니다. 그냥 해

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

호기심이 많은 사람을 케이스 폴 스루라고합니다. 이를 수행 할 수있는 능력이 break;사례 진술을 끝내야 하는 이유 입니다. 자세한 정보는 wikipedia 기사 http://en.wikipedia.org/wiki/Switch_statement를 참조하십시오 .


5

fallthrough다른 사람들 의 대답은 좋은 것입니다.

그러나 또 다른 접근법은 사례 진술의 내용에서 메소드를 추출한 다음 각 사례에서 적절한 메소드를 호출하는 것입니다.

아래 예에서 'text1'과 'text4'는 모두 동일하게 작동합니다.

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

필자는 개인적으로 이러한 스타일의 쓰기 사례 문장이 유지 관리가 쉽고 약간 더 읽기 쉽다는 것을 알고 있습니다.


1
이 경우보다 유지 보수가되지 않습니다 text1text4거의 확실 관계없이 미래의 변화, 같은 일을 할 것입니다. 그것들이 항상 연결되어 있어야하는 경우에 대해 대소 문자를 변경하려면 text1(이것이 호출하는 메소드 변경을 의미 함)의 변경이 필요합니다 text4. 이 경우 분명히 유지 관리가 쉽지 않습니다. 상황에 따라 다릅니다.
Nick Freeman

1
스위치 문은 (IMHO) 가장 예쁜 프로그래밍 구조가 아니기 때문에이 방법은 어쨌든 다른 방법과 결합되어야한다고 말할 것입니다.
Nick Freeman

5

접근을 통한 추락은 내가 느끼는 최고의 것입니다.

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

5

당신이 사용할 수있는:

case text1: case text4: 
     do stuff;
     break;

4

케이스 값은 동일한 진입 점을 공유 할 수있는 코드가없는 "goto"포인트입니다.

case text1 :
case text4 : {
// 뭔가
깨어 라;
}

중괄호는 중복입니다.


1

JEP 354 : JDK-13의 스위치 표현식 (미리보기) JEP 361 : JDK-14의 스위치 표현식 (표준) 스위치 문 을 확장하여 표현식 으로 사용할 수 있습니다.

이제 다음을 수행 할 수 있습니다.

  • 에서 직접 할당 변수 스위치 표현 ,
  • 새로운 형식의 스위치 레이블 ( case L ->)을 사용하십시오.

    "case L->"스위치 레이블의 오른쪽에있는 코드는 표현식, 블록 또는 (편의를 위해) throw 문으로 제한됩니다.

  • 쉼표로 구분하여 사례 당 여러 상수를 사용하십시오.
  • 또한 더 이상 가치 나누기 가 없습니다 .

    스위치 식에서 값을 산출하기 위해 breakwith value 문이 문을 대신하여 삭제됩니다 yield.

따라서 답변 중 하나의 데모 는 다음과 같습니다.

public class SwitchExpression {

  public static void main(String[] args) {
      int month = 9;
      int year = 2018;
      int numDays = switch (month) {
        case 1, 3, 5, 7, 8, 10, 12 -> 31;
        case 4, 6, 9, 11 -> 30;
        case 2 -> {
          if (java.time.Year.of(year).isLeap()) {
            System.out.println("Wow! It's leap year!");
            yield 29;
          } else {
            yield 28;
          }
        }
        default -> {
          System.out.println("Invalid month.");
          yield 0;
        }
      };
      System.out.println("Number of Days = " + numDays);
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.