我正在尝试将用字母写的电话号码转换为真正的数字形式。我在for循环中有这个switch语句,它查看字符串的每个字符,但是eclipse说我有重复的情况('G'|'H'|'我','J'|'K'|' L','M'|'N'|'O')我不明白为什么?
switch(parts[1].charAt(i)){
case 'A' | 'B' | 'C' : number.concat("2"); break;
case 'D' | 'E' | 'F' : number.concat("3"); break;
case 'G' | 'H' | 'I' : number.concat("4"); break;
case 'J' | 'K' | 'L' : number.concat("5"); break;
case 'M' | 'N' | 'O' : number.concat("6"); break;
case 'P' | 'Q' | 'R' | 'S' : number.concat("7"); break;
case 'T' | 'U' | 'V' : number.concat("8"); break;
case 'W' | 'X' | 'Y' | 'Z' : number.concat("9"); break;
}
答案 0 :(得分:6)
非常有趣,我想我知道发生了什么。
执行'A' | 'B'
时,您在A和B的字节值上执行按位或运算。您的IDE检测到一些结果值是等效的。这个肯定不是你想要做的。
你想要的更像是:
case 'A':
case 'B':
case 'C':
number.concat("2");
break;
case 'D':
[...]
等等。
有关详细信息,请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html上的“SwitchDemo2”。
验证(使用Python):
>>> ord('G') | ord('H') | ord('I')
79
>>> ord('J') | ord('K') | ord('L')
79
答案 1 :(得分:5)
代码中的|
字符用作bitwise OR operator使用switch
代替
switch(parts[1].charAt(i)){
case 'A':
case 'B':
case 'C':
number.concat("2");
break;
...
查看这些bytevalues的结果
System.out.println('G' | 'H' | 'I');
System.out.println('J' | 'K' | 'L');
都打印79
与switch语句关联的两个case常量表达式中没有两个可能具有相同的值。
阅读switch tutorial以了解如何使用穿透
答案 2 :(得分:0)
每个字符都有二进制等价物。例如,'G'具有二进制值01000111.当您应用按位OR运算符'|'时,您匹配8个二进制位中的每一个,如果它们是1则为1,如果它们都是0,则产生1。所以'G '| 'H'相当于将01000111的位与01001000匹配(H的二进制表示 - 它们按顺序从01000001处的'A'开始)。结果是01001111,转换为十进制时给出79。 如果你进行手动练习,你确实会发现'G'| 'H'| '我'相当于'J'| 'K'| 'L'。