如何将多条件if语句转为switch case?输入反向数字仅输出单值求助
代码重构:将多条件if转换为switch并解决顺序处理异常
原问题与代码
原代码使用多条件if语句匹配字符串中的数字字符并转换为对应编码,但存在逻辑错误:输入数字顺序为9到1时,仅能显示一个数值。原代码如下:
if (textLetter.toLowerCase().contains('1')) { textCodeElec += ' 19'; textLetter = textLetter.substring(1); } if (textLetter.toLowerCase().contains('2')) { textCodeElec += ' 00'; textLetter = textLetter.substring(1); } if (textLetter.toLowerCase().contains('3')) { textCodeElec += ' 70'; textLetter = textLetter.substring(1); } if (textLetter.toLowerCase().contains('4')) { textCodeElec += ' 08'; textLetter = textLetter.substring(1); } if (textLetter.toLowerCase().contains('5')) { textCodeElec += ' 56'; textLetter = textLetter.substring(1); } if (textLetter.toLowerCase().contains('6')) { textCodeElec += ' 68'; textLetter = textLetter.substring(1); } if (textLetter.toLowerCase().contains('7')) { textCodeElec += ' 20'; textLetter = textLetter.substring(1); } if (textLetter.toLowerCase().contains('8')) { textCodeElec += ' 16'; textLetter = textLetter.substring(1); } if (textLetter.toLowerCase().contains('9')) { textCodeElec += ' 27'; textLetter = textLetter.substring(1); }
问题根源
原代码的核心错误在于:
- 使用
contains()判断字符是否存在,但不管字符在字符串中的位置,只要存在就触发处理。 - 处理完后调用
substring(1)直接截取第一个字符之后的内容,而非移除匹配到的目标字符。例如输入"91"时,第一个if检测到包含'1',就将字符串截为"1",后续检测'9'时字符串中已无'9',导致仅处理了'1'对应的编码。
重构后的Switch Case代码
以下代码通过遍历每个字符逐个处理,用switch替代多条件if,同时修正字符串处理逻辑,确保无论输入顺序如何,所有数字字符都能被正确转换:
基础版本(直接处理所有字符)
// 统一转换为小写,避免重复调用toLowerCase() String lowerTextLetter = textLetter.toLowerCase(); // 遍历字符串中的每个字符 for (char c : lowerTextLetter.toCharArray()) { switch (c) { case '1': textCodeElec += " 19"; break; case '2': textCodeElec += " 00"; break; case '3': textCodeElec += " 70"; break; case '4': textCodeElec += " 08"; break; case '5': textCodeElec += " 56"; break; case '6': textCodeElec += " 68"; break; case '7': textCodeElec += " 20"; break; case '8': textCodeElec += " 16"; break; case '9': textCodeElec += " 27"; break; // 可选:处理非数字字符 default: // 不处理或执行其他逻辑 break; } } // 若需要清空原字符串(与原代码逻辑对齐) textLetter = "";
进阶版本(保留未处理字符)
如果需要保留原字符串中未匹配的字符(与原代码处理后保留剩余字符的意图一致),可以使用StringBuilder存储未处理字符:
String lowerTextLetter = textLetter.toLowerCase(); StringBuilder remainingChars = new StringBuilder(); for (char c : lowerTextLetter.toCharArray()) { boolean isProcessed = false; switch (c) { case '1': textCodeElec += " 19"; isProcessed = true; break; case '2': textCodeElec += " 00"; isProcessed = true; break; case '3': textCodeElec += " 70"; isProcessed = true; break; case '4': textCodeElec += " 08"; isProcessed = true; break; case '5': textCodeElec += " 56"; isProcessed = true; break; case '6': textCodeElec += " 68"; isProcessed = true; break; case '7': textCodeElec += " 20"; isProcessed = true; break; case '8': textCodeElec += " 16"; isProcessed = true; break; case '9': textCodeElec += " 27"; isProcessed = true; break; default: isProcessed = false; break; } // 未处理的字符保留到剩余字符串中 if (!isProcessed) { remainingChars.append(c); } } // 更新原字符串为未处理的字符 textLetter = remainingChars.toString();
重构优势
- 逻辑正确:遍历每个字符逐个处理,无论输入顺序如何,所有目标字符都会被转换。
- 可读性强:用
switch替代冗余的多条件if,代码结构更清晰。 - 可维护性高:新增或修改字符映射时,只需在
switch中添加/修改对应分支即可。
内容的提问来源于stack exchange,提问作者phúc tidi
相关产品推荐
相关产品推荐

