大家好,
我有一个看起来像这样的字符串(摩尔斯电码):
....x.x.-..x.-..x---xx...x-x.-x-.-.x-.-x---x...-x.x.-.x..-.x.-..x---x.--
单个“ x”表示字母到此为止,双“ x”表示字母是整个单词的结尾。我有一张带有莫尔斯电码的地图。我将字符串除以“ x”,然后将每个编码的字母与字典中的值进行比较,并将匹配的键附加到我的StringBuilder上,它可以正常工作,但我想在单词之间保留空格,而不是双xx。
我的一段代码:
private static final Map<Character, String> morseCode;
static {
morseCode = new HashMap<Character, String>();
morseCode.put('h', "....");
morseCode.put('e', ".");
morseCode.put('l', ".-..");
morseCode.put('o', "---");
morseCode.put('s', "...");
morseCode.put('t', "-");
morseCode.put('a', ".-");
morseCode.put('c', "-.-.");
morseCode.put('k', "-.-");
morseCode.put('v', "...-");
morseCode.put('r', ".-.");
morseCode.put('f', "..-.");
morseCode.put('w', ".--");
}
String decodedMorseTable = "....x.x.-..x.-..x---xx...x-x.-x-.-.x-.-x---x...-x.x.-.x..-.x.-..x---x.--"
StringBuilder decodedText = new StringBuilder();
String[] splitLetters = decodedMorseTable.split("x");
for(String letter: splitLetters) {
for(Map.Entry<Character, String> entry: morseCode.entrySet()) {
if(entry.getValue().equals(letter))
decodedText.append(entry.getKey());
输出:
hellostackoverflow
答案 0 :(得分:2)
首先尝试将输入分割成单独的单词(按xx
)。然后像以前一样拆分每个单词:
String decodedMorseTable = "....x.x.-..x.-..x---xx...x-x.-x-.-.x-.-x---x...-x.x.-.x..-.x.-..x---x.--";
StringBuilder decodedText = new StringBuilder();
String[] words = decodedMorseTable.split("xx");
for (String word : words) {
String[] splitLetters = word.split("x");
for (String letter : splitLetters) {
for (Map.Entry<Character, String> entry : morseCode.entrySet()) {
if (entry.getValue().equals(letter))
decodedText.append(entry.getKey());
}
}
decodedText.append(" ");
}
更新
如果您将morseCode
修改为将莫尔斯字母作为键,将字符作为值,则代码看起来会更简单(避免第3循环):
private static final Map<String, Character> morseCode;
static {
morseCode = new HashMap<>();
morseCode.put("....", 'h');
morseCode.put(".", 'e');
morseCode.put("", ' ');
...
String[] splitLetters = word.split("x");
for (String letter : splitLetters) {
decodedText.append(morseCode.get(letter));
}
Java 1.8 + 解决方案:
Arrays.stream(decodedMorseTable.split("x"))
.map(morseCode::get)
.forEach(decodedText::append);
答案 1 :(得分:0)
如果我正确理解了您的问题,则所需的输出将如下所示:
hello stackoverflow
您可以尝试的是先获取所有带有dcodedMorseTable.indexOf(“ xx”)的“ xx”的索引,然后在这些位置插入一个空格。但是请记住,将插入的空间偏移之前插入的空间数量。