Java - 字符中的重复案例标签

Wyr*_*zeu 1 java label case duplicates

由于未知原因,我在此方法中仅在两个案例块中出现了重复的案例标签错误.当我在每个单独的字母中分隔案例时,也会出现这种情况(在'O'字符上出现错误).是否可以在不将字母改为小写的情况下修复它?

Szyferka(String szyfr){
    char []buf = szyfr.toCharArray();
    int len=szyfr.length();
    for(int i=0; i<len; i++){
        switch(buf[i]){
            case 'A' | 'B' | 'C': buf[i]='2';
            case 'D' | 'E' | 'F': buf[i]='3';
            case 'G' | 'H' | 'I': buf[i]='4';
            case 'J' | 'K' | 'L': buf[i]='5'; //duplicate case label
            case 'M' | 'N' | 'O': buf[i]='6'; //duplicate case label
            case 'P' | 'Q' | 'R' | 'S': buf[i]='7';
            case 'T' | 'U' | 'V': buf[i]='8';
            case 'W' | 'X' | 'Y' | 'Z': buf[i]='9';
            case '.': buf[i]='1';
            case ' ': buf[i]='0';
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

问题是你正在使用按位|来组合字符 - 这并不像我认为的那样提供多个案例.相反,它只是为不同的字符取Unicode值,并将它们与按位或运算相结合.

这将显示您收到重复案例错误的原因:

System.out.println('G' | 'H' | 'I');
System.out.println('J' | 'K' | 'L');
System.out.println('M' | 'N' | 'O');
Run Code Online (Sandbox Code Playgroud)

所有三条线都打印79.

你真的想要:

case 'A': case 'B': case 'C': buf[i]='2'; break;
case 'D': case 'E': case 'F': buf[i]='3'; break;
etc
Run Code Online (Sandbox Code Playgroud)

(我个人也会重新格式化,但这是另一回事.请注意这些break陈述!)

您可能还想考虑使用Map<Character, Character>switch语句而不是switch语句.