3

文字で書かれた電話番号を実際の数値形式に変換しようとしています。文字列の各文字を調べる for ループ内にこの switch ステートメントがありますが、Eclipse はケースが重複していると言っています ('G' | 'H' | 'I', '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; 
}
4

3 に答える 3

6

面白いことに、私は何が起こっているのか知っていると思います。

を実行すると、A と B のバイト値に対して'A' | 'B'ビットごとの OR が実行されます。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
于 2013-10-19T00:42:15.060 に答える
0

各文字には、同等のバイナリがあります。たとえば、「G」のバイナリ値は 01000111 です。ビットごとの OR 演算子「|」を適用すると、8 つのバイナリ ビットのそれぞれが一致し、いずれかが 1 の場合は 1 になり、両方が 0 の場合は 0 になります。 ' | 「H」は、01000111 のビットを 01001000 (H の 2 進数表現 - 01000001 の「A」から順番に表示) に一致させることと同じです。結果は 01001111 で、これを 10 進数に変換すると 79 になります。'H' | 「I」は「J」と同等 | 'K' | 「L」。

于 2013-10-19T01:04:14.913 に答える