我想将摩尔斯电码翻译成文字。还有一个小问题
I want to translate morse code into words. Still have a small problem
所以我在“ ”分裂。问题是莫尔斯码将每个单词除以三个 space。 ” “。
所以当我翻译时,它总是打印出每个写在一起的单词,中间没有 spaces。
这是我的。我使用 StringBuilder 的原因很明显。
public class MorseCodeDecoder {
public static String decode(String morseCode) {
String word = "";
String character = "";
//count how much space is inbetween lines.
StringBuilder codeTwo = new StringBuilder();
String[] output = morseCode.split(" ");
for (int i = 0; i < output.length; i++) {
在这里我尝试做一个单独的 if 语句。如果 morseCode 包含三个 space 背对背追加一个 space.
//if(morseCode.contains(" ")) codeTwo.append(" "); (or \s maybe, doesnt matter)
switch (output[i]) {
case " ":
codeTwo.append(" ");
break;
case ".-":
codeTwo.append("A");
break;
case "-...":
codeTwo.append("B");
break;
case "-.-.":
codeTwo.append("C");
break;
case "-..":
codeTwo.append("D");
break;
case ".":
codeTwo.append("E");
break;
case "..-.":
codeTwo.append("F");
break;
case "--.":
codeTwo.append("G");
break;
case "....":
codeTwo.append("H");
break;
case "..":
codeTwo.append("I");
break;
case ".---":
codeTwo.append("J");
break;
case "-.-":
codeTwo.append("K");
break;
case ".-..":
codeTwo.append("L");
break;
case "--":
codeTwo.append("M");
break;
case "-.":
codeTwo.append("N");
break;
case "---":
codeTwo.append("O");
break;
case ".--.":
codeTwo.append("P");
break;
case "--.-":
codeTwo.append("Q");
break;
case ".-.":
codeTwo.append("R");
break;
case "...":
codeTwo.append("S");
break;
case "-":
codeTwo.append("T");
break;
case "..-":
codeTwo.append("U");
break;
case "...-":
codeTwo.append("V");
break;
case ".--":
codeTwo.append("W");
break;
case "-..-":
codeTwo.append("X");
break;
case "-.--":
codeTwo.append("Y");
break;
case "--..":
codeTwo.append("Z");
break;
}
}
return codeTwo.toString();
}
}
对于输入:.... . -.-- .--- ..- -..
预期输出:"HEY JUDE"
您可以使用正则表达式而不是按空格分隔...
像这样的图案:
([._])+\s*
说明:我们正在寻找至少 1 个点 (.) 或下划线 (_) 后跟零个或多个空格的实例...
我在这个例子中使用了它:
._ _... _._ .._ ..._ .__
即:ABC UVW
我不在电脑附近 - 但程序应该看起来像这样:
public static String decode(final String morseCode) {
final Matcher matcher = pattern.matcher(morseCode);
final StringBuilder builder = new StringBuilder();
while(matcher.find()) {
builder.append(getLetter(matcher.group().trim()));
}
return builder.toString();
}
假设 getLetter()
是你的开关盒。
更吹毛求疵 - 与其使用这种巨大的开关盒,不如使用静态映射,其中包含符号和字母之间的映射,并在静态构造函数 (https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html) 上对其进行初始化
希望对您有所帮助。
你的问题是,因为你的字母和你的单词共享一个分隔符,当你被一个 space 分割时,你实际上完全删除了你的单词间距,所以 switch 语句永远没有机会读取他们。我可以想到两种解决方案。第一个是我下面的代码。由于摩尔斯电码只使用一组特定的字符,您可以简单地将单词分隔符替换为字母表之外的字符,然后检测它。对于第二种可能的解决方案,如果你想保持输入的完整性,那么你也可以先用三个 space 分割来分隔每个单词,然后在每个单词上使用你的 switch 语句,附加一个space 每个单词都被成功翻译后。这将需要两个循环(单词的外循环和字母的内循环)。
public class MorseCodeDecoder {
public static String decode(String morseCode) {
String word = "";
String character = "";
//count how much space is inbetween lines.
StringBuilder codeTwo = new StringBuilder();
morseCode.replace(" ", "|");
String[] output = morseCode.split(" ");
for (int i = 0; i < output.length; i++) {
switch (output[i]) {
case "|":
codeTwo.append(" ");
break;
case ".-":
codeTwo.append("A");
break;
//etc.
}
return codeTwo.toString();
}
}
所以我在“ ”分裂。问题是莫尔斯码将每个单词除以三个 space。 ” “。
所以当我翻译时,它总是打印出每个写在一起的单词,中间没有 spaces。
这是我的。我使用 StringBuilder 的原因很明显。
public class MorseCodeDecoder {
public static String decode(String morseCode) {
String word = "";
String character = "";
//count how much space is inbetween lines.
StringBuilder codeTwo = new StringBuilder();
String[] output = morseCode.split(" ");
for (int i = 0; i < output.length; i++) {
在这里我尝试做一个单独的 if 语句。如果 morseCode 包含三个 space 背对背追加一个 space.
//if(morseCode.contains(" ")) codeTwo.append(" "); (or \s maybe, doesnt matter)
switch (output[i]) {
case " ":
codeTwo.append(" ");
break;
case ".-":
codeTwo.append("A");
break;
case "-...":
codeTwo.append("B");
break;
case "-.-.":
codeTwo.append("C");
break;
case "-..":
codeTwo.append("D");
break;
case ".":
codeTwo.append("E");
break;
case "..-.":
codeTwo.append("F");
break;
case "--.":
codeTwo.append("G");
break;
case "....":
codeTwo.append("H");
break;
case "..":
codeTwo.append("I");
break;
case ".---":
codeTwo.append("J");
break;
case "-.-":
codeTwo.append("K");
break;
case ".-..":
codeTwo.append("L");
break;
case "--":
codeTwo.append("M");
break;
case "-.":
codeTwo.append("N");
break;
case "---":
codeTwo.append("O");
break;
case ".--.":
codeTwo.append("P");
break;
case "--.-":
codeTwo.append("Q");
break;
case ".-.":
codeTwo.append("R");
break;
case "...":
codeTwo.append("S");
break;
case "-":
codeTwo.append("T");
break;
case "..-":
codeTwo.append("U");
break;
case "...-":
codeTwo.append("V");
break;
case ".--":
codeTwo.append("W");
break;
case "-..-":
codeTwo.append("X");
break;
case "-.--":
codeTwo.append("Y");
break;
case "--..":
codeTwo.append("Z");
break;
}
}
return codeTwo.toString();
}
}
对于输入:.... . -.-- .--- ..- -.. 预期输出:"HEY JUDE"
您可以使用正则表达式而不是按空格分隔... 像这样的图案:
([._])+\s*
说明:我们正在寻找至少 1 个点 (.) 或下划线 (_) 后跟零个或多个空格的实例...
我在这个例子中使用了它:
._ _... _._ .._ ..._ .__
即:ABC UVW
我不在电脑附近 - 但程序应该看起来像这样:
public static String decode(final String morseCode) {
final Matcher matcher = pattern.matcher(morseCode);
final StringBuilder builder = new StringBuilder();
while(matcher.find()) {
builder.append(getLetter(matcher.group().trim()));
}
return builder.toString();
}
假设 getLetter()
是你的开关盒。
更吹毛求疵 - 与其使用这种巨大的开关盒,不如使用静态映射,其中包含符号和字母之间的映射,并在静态构造函数 (https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html) 上对其进行初始化
希望对您有所帮助。
你的问题是,因为你的字母和你的单词共享一个分隔符,当你被一个 space 分割时,你实际上完全删除了你的单词间距,所以 switch 语句永远没有机会读取他们。我可以想到两种解决方案。第一个是我下面的代码。由于摩尔斯电码只使用一组特定的字符,您可以简单地将单词分隔符替换为字母表之外的字符,然后检测它。对于第二种可能的解决方案,如果你想保持输入的完整性,那么你也可以先用三个 space 分割来分隔每个单词,然后在每个单词上使用你的 switch 语句,附加一个space 每个单词都被成功翻译后。这将需要两个循环(单词的外循环和字母的内循环)。
public class MorseCodeDecoder {
public static String decode(String morseCode) {
String word = "";
String character = "";
//count how much space is inbetween lines.
StringBuilder codeTwo = new StringBuilder();
morseCode.replace(" ", "|");
String[] output = morseCode.split(" ");
for (int i = 0; i < output.length; i++) {
switch (output[i]) {
case "|":
codeTwo.append(" ");
break;
case ".-":
codeTwo.append("A");
break;
//etc.
}
return codeTwo.toString();
}
}