Получение ошибки при декодировании Морзе - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь расшифровать данный морс на английский. Тем не менее, я получаю ошибку в коде, который я написал. Вот мой код:

String code=".... . -.--   .--- ..- -.. ."; //Decodes to "HEY JUDE"
String[] letters = code.split(" ");
StringBuilder res = new StringBuilder();
for(String str : letters){
    if(!str.equals(""))
        res.append(MorseCode.get(str));
    else res.append(" ");
}
System.out.println(res);

В строке 7, если я напишу:

res.append(" ");

Вывод:

ЭЙ ДЖУД

Если я напишу:

res.append("");

Вывод:

HEYJUDE

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Если вы используете Map<String, String> в качестве словаря, вы можете сделать что-то вроде этого. Замените null значения на ' ' и отслеживайте char, напечатанный ранее в цикле, чтобы напечатать только один пробел.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MorseCode {

    static Map<String, Character> morseDictionary;

    public static void main(String[] args) {
        morseDictionary = new HashMap<String, Character>();
        morseDictionary.put("....", 'H');
        morseDictionary.put(".", 'E');
        morseDictionary.put("-.--", 'Y');
        morseDictionary.put(".---", 'J');
        morseDictionary.put("..-", 'U');
        morseDictionary.put("-..", 'D');

        String morseCode = ".... . -.--   .--- ..- -.. .";
        printTranslationOf(morseCode);
    }

    public static void printTranslationOf(String morseCode) {

        String[] singleCharacters = morseCode.split(" ");

        List<Character> latinCharacters = new ArrayList<Character>();

        char lastChar = ' ';
        for (String character : singleCharacters) {
            char printable = morseDictionary.get(character) == null ?
                    ' ' : morseDictionary.get(character);

            if (printable == ' ') {
                if (lastChar != ' ') {
                    latinCharacters.add(printable);
                }
            } else {
                latinCharacters.add(printable);
            }

            lastChar = printable;
        }

        latinCharacters.forEach((Character character) -> {
            System.out.print(character);
        });
    }
}
0 голосов
/ 31 августа 2018

Я не уверен, почему вы пытаетесь решить эту проблему только одним циклом. Более простое и, вероятно, более читаемое решение будет

  1. разбиение code на 3 пробела для получения всех отдельных закодированных слов, таких как ".... . -.--" и ".--- ..- -.. ."
  2. разбить каждое закодированное «слово» на 1 пробел, чтобы получить одну последовательность кода Морзе ".... . -.--" -> "...." "." "-.--"

Тогда вы можете

  • преобразовать азбуку Морзе в букву,
  • объединить расшифрованные буквы в слова,
  • объединить слова в предложение (разделить их пробелом).

Так ваш код может выглядеть как

StringJoiner sentence = new StringJoiner(" ");    // decoded words should be 
                                                  // separated with single space
for (String section : code.split("   ")){ 
    StringBuilder word = new StringBuilder();
    for(String morse : section.split(" ")){
        word.append(MorseCode.get(morse));
    }
    sentence.add(word.toString());
}

String result = sentence.toString();

Если вам не нравится воссоздавать StringBuilder в каждой итерации (для каждого слова), вы можете создать цикл перед циклом и сбросить его в начале каждой итерации с помощью setLength(0).

0 голосов
/ 31 августа 2018

Три последовательных пробела, разделенные пробелом, дадут вам две пустые строки (пустую строку между первым и вторым последовательными пробелами плюс строку между вторым и третьим последовательными пробелами).

Вам нужно либо изменить способ кодирования пространств сообщений, либо обработать эти две последовательные пустые строки. Предполагая, что вы не можете изменить кодировку сообщений и пробелы всегда идут отдельно (разделитель букв) или на три (кодированный пробел), будет работать следующее:

String code=".... . -.--   .--- ..- -.. ."; //Decodes to "HEY JUDE"
Iterator<String> letters = Arrays.asList(code.split(" ")).iterator();
StringBuilder res = new StringBuilder();
while(letters.hasNext()) {
    String current = letters.next();
    if (! "".equals(current)) { // we have a letter
        res.append(MorseCode.get(current));
    } else { // we have an empty string, the first of two which represent a space
        res.append(" ");
        letters.next(); // we skip the next item which will be an empty string
    }
}
System.out.println(res);

Вы можете попробовать здесь (с буквой, представленной как x, поскольку у меня нет вашего класса MorseCode).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...