摩尔斯码转英文:连续双空格识别与空格添加问题求助
摩尔斯码转英文的空格处理问题
问题描述
我正在开发摩尔斯码转英文的程序,现在卡在空格处理环节:摩尔斯码规则是单个空格分隔字母,连续两个空格代表英文空格,但用单个空格分割字符串数组时,无法识别连续双空格,导致转换后的英文没有正确的空格分隔。
当前代码
public static void main(String[] args) throws IOException { InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8); BufferedReader in = new BufferedReader(reader); String line; String newMorse = ""; String selectedMorse; String convertedMorse; int x = 0; while ((line = in.readLine()) != null) { String[] morseChars = line.split(" "); for (int i = 0; i < morseChars.length; i++) { selectedMorse = morseChars[i]; convertedMorse = decode(selectedMorse); newMorse = newMorse + convertedMorse; } System.out.println(newMorse); } }
示例
- 输入:
.- ...- ..--- .-- .... .. . -.-. -..- ....- .....(注意中间的双空格) - 预期输出:
AV2WHIECX 45
解决方案
核心问题是split(" ")会忽略连续空格产生的空字符串,导致无法判断双空格的存在。以下两种方法可以解决:
方法1:保留分割后的空字符串
使用split(" ", -1)重载方法,它会保留分割产生的所有空字符串(包括连续空格带来的空元素)。遍历数组时判断元素是否为空:
- 空字符串代表双空格,直接添加英文空格;
- 非空元素则正常解码拼接。
修改后的代码:
public static void main(String[] args) throws IOException { InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8); BufferedReader in = new BufferedReader(reader); String line; // 用StringBuilder提升拼接效率,避免频繁创建字符串对象 StringBuilder newMorse = new StringBuilder(); String selectedMorse; String convertedMorse; while ((line = in.readLine()) != null) { // 保留所有分割结果,包括空字符串 String[] morseChars = line.split(" ", -1); for (int i = 0; i < morseChars.length; i++) { selectedMorse = morseChars[i]; if (selectedMorse.isEmpty()) { newMorse.append(" "); } else { convertedMorse = decode(selectedMorse); newMorse.append(convertedMorse); } } System.out.println(newMorse); // 处理完一行后清空,避免下一行内容混淆 newMorse.setLength(0); } }
方法2:先替换双空格为特殊标记
先把输入中的连续双空格替换成一个特殊标记(比如|),再用单个空格分割,遍历遇到标记时添加英文空格:
public static void main(String[] args) throws IOException { InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8); BufferedReader in = new BufferedReader(reader); String line; StringBuilder newMorse = new StringBuilder(); String selectedMorse; String convertedMorse; while ((line = in.readLine()) != null) { // 把双空格替换为特殊标记 String processedLine = line.replace(" ", " | "); String[] morseChars = processedLine.split(" "); for (int i = 0; i < morseChars.length; i++) { selectedMorse = morseChars[i]; if ("|".equals(selectedMorse)) { newMorse.append(" "); } else { convertedMorse = decode(selectedMorse); newMorse.append(convertedMorse); } } System.out.println(newMorse); newMorse.setLength(0); } }
额外优化建议
- 用
StringBuilder代替直接字符串拼接(newMorse = newMorse + convertedMorse),大幅提升性能; - 处理完每行后清空
StringBuilder,防止跨内容拼接。
内容的提问来源于stack exchange,提问作者compsci3289294
相关产品推荐
相关产品推荐

