Java实现Caesar cipher解码器输出不符合预期,求排查解决
凯撒密码解码器代码问题排查
核心问题:代码块括号匹配错误
你在if (keyVal < 0)的代码块中,错误地将字符替换和结果拼接逻辑包含在了if的大括号内。这导致只有当计算出的keyVal为负数时,字母字符才会被处理并添加到结果中,其他情况下(keyVal≥0)的字母字符直接被跳过,完全不会出现在最终输出里。这就是测试时大部分字符丢失的根本原因。
修复步骤
调整if块的闭合括号位置,让字符替换和拼接逻辑在所有字母字符的处理流程中都执行:
// 原错误代码段 if (keyVal < 0) { keyVal = ALPHABET.length() + keyVal; char replaceVal = ALPHABET.charAt(keyVal); message += replaceVal; } // 修正后代码段 if (keyVal < 0) { keyVal = ALPHABET.length() + keyVal; } char replaceVal = ALPHABET.charAt(keyVal); message += replaceVal;(可选优化)循环中使用
String拼接效率较低,建议改用StringBuilder提升性能:
将String message = "";替换为StringBuilder message = new StringBuilder();,循环内的message += ...替换为message.append(...);,最后返回message.toString();。
完整修正代码
import java.io.*; import java.util.*; public class SimpleDecoder { public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz"; public static String BetterDecrypt(String cipherText, int shiftKey) { cipherText = cipherText.toLowerCase(); StringBuilder message = new StringBuilder(); for (int ii = 0; ii < cipherText.length(); ii++) { char character = cipherText.charAt(ii); if (ALPHABET.contains(Character.toString(character))) { int charPosition = ALPHABET.indexOf(character); int keyVal = (charPosition - shiftKey) % 26; if (keyVal < 0) { keyVal = ALPHABET.length() + keyVal; } char replaceVal = ALPHABET.charAt(keyVal); message.append(replaceVal); } else { message.append(character); } } return message.toString(); } public static void main(String[] args) { System.out.println(BetterDecrypt("ab4c", -1)); // 输出: bc4d(符合预期) System.out.println(BetterDecrypt("ab4c", 1)); // 输出: za4b(符合预期) } }
内容的提问来源于stack exchange,提问作者Jackster
相关产品推荐
相关产品推荐

