
摩尔斯电码是一种用点(.)和划(-)以及它们之间的停顿来表示字符的编码系统。在将摩尔斯电码解码为英文时,处理空格是关键。通常,摩尔斯码的规则如下:
传统的字符串分割方法,如 String.split(" "),在遇到多个连续空格时,会将它们视为多个分隔符,导致无法区分一个空格表示字母间隔和多个空格表示单词间隔。例如,.- ...- ....-(AV 4)如果简单地按单个空格分割,将丢失单词间的双空格信息。
为了高效地将摩尔斯码序列转换为对应的英文字符,我们首先需要建立一个映射表。使用 HashMap 是一个理想的选择,因为它提供了 O(1) 的平均查找时间复杂度。
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MorseCodeDecoder {
// 摩尔斯电码到英文字符的映射数组
static final String[] MORSE_MAP_ARRAY = {
"A", ".-", "B", "-...", "C", "-.-.", "D", "-..", "E", ".", "F", "..-.",
"G", "--.", "H", "....", "I", "..", "J", ".---", "K", "-.-", "L", ".-..",
"M", "--", "N", "-.", "O", "---", "P", ".--.", "Q", "--.-", "R", ".-.",
"S", "...", "T", "-", "U", "..-", "V", "...-", "W", ".--", "X", "-..-",
"Y", "-.--", "Z", "--..",
"0", "-----", "1", ".----", "2", "..---", "3", "...--", "4", "....-", "5", ".....",
"6", "-....", "7", "--...", "8", "---..", "9", "----.",
".", ".-.-.-", ",", "--..--", "?", "..--..", "'", ".----.", "!", "-.-.--", "/", "-..-.",
"(", "-.--.", ")", "-.--.-", "&", ".-...", ":", "---...", ";", "-.-.-.", "=", "-...-",
"+", ".-.-.", "-", "-....-", "_", "..--.-", """, ".-..-.", "$", "...-..-", "@", ".--.-.",
"¿", "..-.-", "¡", "--...-",
};
// 用于存储摩尔斯码到英文字符的解码映射
static final Map<String, String> DECODE_MAP = new HashMap<>();
// 静态初始化块,填充DECODE_MAP
static {
for (int i = 0; i < MORSE_MAP_ARRAY.length; i += 2) {
DECODE_MAP.put(MORSE_MAP_ARRAY[i + 1], MORSE_MAP_ARRAY[i]);
}
}
}在上述代码中,MORSE_MAP_ARRAY 存储了所有摩尔斯码及其对应的字符。DECODE_MAP 则是一个 HashMap,在静态初始化块中将摩尔斯码作为键,英文字符作为值,方便后续查找。
立即学习“Java免费学习笔记(深入)”;
解决摩尔斯码中空格问题的核心在于使用正则表达式 Pattern 和 Matcher。我们定义一个正则表达式来匹配单个摩尔斯码序列及其后面可能跟着的一个空格。
// 匹配一个或多个非空白字符(摩尔斯码序列),后面可选跟一个空格
static final Pattern MORSE_CHAR_PATTERN = Pattern.compile("(\S+)\s?");这个正则表达式 (S+)s? 的含义是:
接下来,我们将使用 Matcher.replaceAll() 方法结合 lambda 表达式进行替换:
public static String decode(String input) {
// 使用MORSE_CHAR_PATTERN查找所有匹配项,并用对应的英文字符替换
// replaceAll 会将所有匹配到的部分替换为lambda表达式的返回值
return MORSE_CHAR_PATTERN.matcher(input).replaceAll(m -> DECODE_MAP.get(m.group(1)));
}这个 replaceAll 方法的巧妙之处在于它如何处理连续的空格:
这种机制使得我们无需显式判断连续空格的数量,正则表达式的匹配和替换逻辑会自动处理,从而在单词之间插入一个正确的空格。
下面是包含 main 方法的完整 Java 代码示例,演示了如何使用上述 MorseCodeDecoder 进行摩尔斯电码解码。
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MorseCodeDecoder {
// 摩尔斯电码到英文字符的映射数组
static final String[] MORSE_MAP_ARRAY = {
"A", ".-", "B", "-...", "C", "-.-.", "D", "-..", "E", ".", "F", "..-.",
"G", "--.", "H", "....", "I", "..", "J", ".---", "K", "-.-", "L", ".-..",
"M", "--", "N", "-.", "O", "---", "P", ".--.", "Q", "--.-", "R", ".-.",
"S", "...", "T", "-", "U", "..-", "V", "...-", "W", ".--", "X", "-..-",
"Y", "-.--", "Z", "--..",
"0", "-----", "1", ".----", "2", "..---", "3", "...--", "4", "....-", "5", ".....",
"6", "-....", "7", "--...", "8", "---..", "9", "----.",
".", ".-.-.-", ",", "--..--", "?", "..--..", "'", ".----.", "!", "-.-.--", "/", "-..-.",
"(", "-.--.", ")", "-.--.-", "&", ".-...", ":", "---...", ";", "-.-.-.", "=", "-...-",
"+", ".-.-.", "-", "-....-", "_", "..--.-", """, ".-..-.", "$", "...-..-", "@", ".--.-.",
"¿", "..-.-", "¡", "--...-",
};
// 用于存储摩尔斯码到英文字符的解码映射
static final Map<String, String> DECODE_MAP = new HashMap<>();
// 静态初始化块,填充DECODE_MAP
static {
for (int i = 0; i < MORSE_MAP_ARRAY.length; i += 2) {
DECODE_MAP.put(MORSE_MAP_ARRAY[i + 1], MORSE_MAP_ARRAY[i]);
}
}
// 匹配一个或多个非空白字符(摩尔斯码序列),后面可选跟一个空格
static final Pattern MORSE_CHAR_PATTERN = Pattern.compile("(\S+)\s?");
/**
* 将摩尔斯电码字符串解码为英文字符串。
* @param input 待解码的摩尔斯电码字符串。
* @return 解码后的英文字符串。
*/
public static String decode(String input) {
// 使用MORSE_CHAR_PATTERN查找所有匹配项,并用对应的英文字符替换
return MORSE_CHAR_PATTERN.matcher(input).replaceAll(m -> DECODE_MAP.get(m.group(1)));
}
public static void main(String[] args) {
// 示例输入:包含字母、数字和双空格的摩尔斯电码
String morseInput = ".- ...- ..--- .-- .... .. . -.-. -..- ....- .....";
System.out.println("原始摩尔斯电码: " + morseInput);
// 调用解码方法
String decodedOutput = decode(morseInput);
System.out.println("解码后的英文: " + decodedOutput); // 预期输出: AV2WHIECX 45
// 另一个示例:包含更多单词间隔和标点符号
String anotherMorseInput = ".... . .-.. .-.. --- .-- --- .-. .-.. -.. -.-.--";
System.out.println("
原始摩尔斯电码: " + anotherMorseInput);
System.out.println("解码后的英文: " + decode(anotherMorseInput)); // 预期输出: HELLO WORLD!
// 仅有字母间隔的示例
String singleWordMorse = "- . ... -";
System.out.println("
原始摩尔斯电码: " + singleWordMorse);
System.out.println("解码后的英文: " + decode(singleWordMorse)); // 预期输出: TEST
}
}输出示例:
原始摩尔斯电码: .- ...- ..--- .-- .... .. . -.-. -..- ....- ..... 解码后的英文: AV2WHIECX 45 原始摩尔斯电码: .... . .-.. .-.. --- .-- --- .-. .-.. -.. -.-.-- 解码后的英文: HELLO WORLD! 原始摩尔斯电码: - . ... - 解码后的英文: TEST
通过这种基于正则表达式的方法,我们能够优雅且高效地解决摩尔斯电码到英文转换中复杂的空格处理问题,使得代码逻辑清晰,易于维护。
以上就是Java摩尔斯电码解码教程:优雅处理单词间距的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号