Я хочу перевести азбуку Морзе в слова. Все еще есть небольшая проблема - PullRequest
1 голос
/ 23 января 2020

Так что я разделяюсь на "". Проблема в том, что morsecode делит каждое слово на три пробела. ""

Поэтому, когда я перевожу, он всегда печатает каждое написанное слово без пробелов между ними.

Вот что у меня есть. Я использую 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 содержит три пробела подряд, добавьте один пробел.

//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();
  }
 }

Для ввода: ..... -.-- .--- ..- - ... Ожидаемый результат: "ЭЙ ДЖУД"

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Ваша проблема в том, что, поскольку ваши буквы и ваши слова разделяют разделитель, при разделении на один пробел вы фактически полностью удаляете интервал между словами, поэтому у оператора switch никогда не будет возможности их прочитать. Есть два решения, которые я могу себе представить. Первый код, который я имею ниже. Поскольку азбука Морзе использует только определенный набор символов c, вы можете просто заменить свой разделитель слов символом вне алфавита и затем определить его вместо этого. Для второго возможного решения, если вы хотите сохранить целостность ввода, вы также можете сначала разделить три пробела для разделения каждого слова, а затем использовать оператор switch для каждого слова, добавляя пробел после каждого слова был успешно переведен. Это потребует двух циклов (внешний l oop для слов и внутренний l oop для букв).

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();
    }
}
0 голосов
/ 23 января 2020

Вы можете использовать регулярные выражения вместо разбиения по пробелам ... Примерно так:

([._])+\s*

Объяснение: Мы ищем хотя бы 1 экземпляр точки (.) Или подчеркивания (_ ) за которым следует ноль или более пробелов ...

Я использовал его в этом примере:

._ _... _._   .._ ..._ .__

Что такое: AB C UVW

I ' я не рядом с компьютером - но программа должна выглядеть примерно так:

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() - это ваш вариант коммутатора.

Больше придирки - вместо использования этого массивного переключателя В этом случае вам следует использовать карту stati c, которая будет содержать отображение между символами и буквами, и инициализировать ее в конструкторе stati c (https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)

Надеюсь, что это поможет .

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