我想做一个“摩尔斯电码翻译器”程序,但我有一个问题。
我想要这样的东西:当我们输入摩尔斯电码时,它应该将其翻译成英语,当我们输入英语文本时,它应该返回摩尔斯电码,我使用“A”而不是A。
我的问题是把摩尔斯电码翻译成英语。
当我输入“.-”时,它应该显示“J”,但它显示“A”,因为它们的第一部分是相似的。
我应该怎么做才能解决这个问题?
以下是我在代码中遇到问题的部分:
.replace(".-", "Ⓐ"))
.replace(".---", "Ⓙ"))
.replace("a", ".- "))
.replace("j", ".--- "))
发布于 2018-07-03 21:41:03
这是因为:
这一条:
.replace(".-", "Ⓐ"))
在这里也会出现:
.replace(".---", "Ⓙ"))
考虑大约2个字符串:
.-.-
.-.
使用first replace (例如replaceAll),则字符串将如下所示:
AAAAA
A-A--
原因。-在第一个和第二个字符串中。
为了避免这种情况,您可以使用正则表达式,例如
https://www.tutorialspoint.com/java/java_regular_expressions.htm
或者颠倒替换,但这是不好的做法(有太多的组合,你不能检查所有的东西。一个不错的想法是将所有内容都拆分到mors代码块中,然后检查这些字符串是否相等。
所以你将会有
1: .-
2: .-
3: .-
1: .---
2: .---
3: .---
然后,当你要检查equals时:
-等于。-?true,则替换
-等于。-?false,不替换
如下所示:
public class Main {
public static void main(String[] args) {
String mors = ".-- .- .--- .- .---";
String[] morsBlocks = mors.split(" ");
String[] morsDecoded = new String[morsBlocks.length];
decoder(morsBlocks, morsDecoded);
for(String decoded: morsDecoded) {
System.out.print(decoded + " ");
}
System.out.println("---EOT---");
}
public static void decoder(String[] blocks, String[] decoded) {
for(int index = 0; index < blocks.length; index++) {
String block = blocks[index];
switch(block) {
case ".--":
decoded[index] = "bla";
break;
case ".-":
decoded[index] = "test";
break;
case ".---":
decoded[index] = "omg";
break;
default:
decoded[index] = "UNDEFINED";
break;
}
}
}
}
问候
发布于 2018-07-03 22:07:29
private static String[][] MORSE_TABLE = {
{".-", "Ⓐ"},
{".---", "Ⓙ"},
{"--...", "7"},
{"---", "O"},
{"...", "S"},
...
};
问题是,人们应该首先尝试转换最长的序列,否则永远不会翻译更长的序列。
然而,这仍然是不明确的:您是否有A7或J?因此,停顿(空格)在这些情况下非常有用。
// Sorting on decreasing morse length:
static {
Arrays.sort(MORSE_TABLE,
(pair1, pair2) -> -Integer.compare(pair1[0].length(),
pair2[0].length());
}
然后从头开始,进行顺序替换:
List<String> results = decode(s);
if (results.isEmpty()) {
System.out.println("No results");
} else if (results.size() == 1) {
System.out.println("Result: " + results.get(0));
} else {
System.out.println("Ambiguous result: " + results);
}
List<String> decode(String morse) {
morse = morse.trim();
if (morse.isEmpty()) {
List<String> results = new ArrayList<>();
results.add("");
return results;
}
List<String> results = new ArrayList<>();
for (String m : MORSE_TABLE) {
if (morse.startsWith(m[0]) {
List<String> furthers =
decode(morse.substring(m[0].length));
for (String further : furthers) {
results.add(m[1] + further);
}
}
}
return results;
}
歧义解析也是可能的,如上所示。
https://stackoverflow.com/questions/51154861
复制相似问题