Перевести азбуку Морзе в алфавиты

Я работаю над проектом, который может переводить азбуку Морзе на английский язык и наоборот. Ниже приведена конкретная инструкция: «Ваша программа должна предложить пользователю указать желаемый тип перевода, ввести строку символов азбуки Морзе или английских символов, а затем отобразить переведенные результаты. При вводе азбуки Морзе разделяйте каждую букву/цифру символом один пробел и разделите несколько слов символом «|». Например, --- | -... . будет вводом азбуки Морзе для предложения «быть». Ваша программа должна обрабатывать только одно предложение и может игнорировать знаки препинания."

Хотя я понял, как перевести английский на азбуку Морзе, я не могу понять, как перевести азбуку Морзе на английский. И если вы это читаете, пожалуйста, помогите мне! Любая помощь или подсказки будут очень признательны! Спасибо :)

public static String[] morse = { ".- ", "-... ", "-.-. ", "-.. ", ". ",
        "..-. ", "--. ", ".... ", ".. ",

        ".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ",
        ".-. ", "... ", "- ", "..- ",

        "...- ", ".-- ", "-..- ", "-.-- ", "--.. ", "|" };

public static String[] alphabet = { "a", "b", "c", "d", "e", "f", "g", "h",
        "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
        "v", "w", "x", "y", "z", " " };

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Input '1' to translate English to Morse Code.");
    System.out.println("Input '2' to translate Morse Code to English.");
    int kind = in.nextInt();

    if (kind == 1) {
        System.out.println("Please insert an alphabet string");
        String Eng = in.next();
        EngToMo(Eng);
    }
    if (kind == 2) {
        System.out.println("Please insert a morse string");
        String Mor = in.next();
        MoToEng(Mor);
    }

}

public static void EngToMo(String string1) {
    String Upper1 = string1.toUpperCase();
    for (int i = 0; i < Upper1.length(); i++) {
        char x = Upper1.charAt(i);
        if (x != ' ') {
            System.out.print(morse[x - 'A'] + " ");
        } else {
            System.out.println(" | ");
        }
    }
}

public static void MoToEng(String string2) {

    }
}

person Daniel Tian    schedule 19.01.2015    source источник
comment
Азбука Морзе будет только для букв и цифр, и это тоже для английского языка? Правильно?? Если это так, вы можете создать константы для каждой азбуки Морзе в классе констант и сравнить их. самый простой способ.   -  person Bilbo Baggins    schedule 19.01.2015
comment
Хотя не будет ли это несколько излишним?   -  person Daniel Tian    schedule 19.01.2015
comment
да, использование карты было бы лучшим подходом   -  person Bilbo Baggins    schedule 19.01.2015


Ответы (3)


Я предлагаю создать словарь с использованием Hashtable, где алфавиты могут использоваться в качестве ключа, а соответствующий код Морзе может быть связан с этим ключом. Если вы хотите иметь уникальную пару "ключ-значение", вы можете использовать BiMap. для хранения.

Map<String, String> codeMap = new HashMap<String, String>();
codeMap.put("A", ".- ");
codeMap.put("B", "-... ");

вы можете легко получить доступ к этой карте, чтобы получить ключи или значения

for (String key: codeMap.keySet() ){
    System.out.println(key+" : "+codeMap.get(key) );
}
person imTheManager    schedule 19.01.2015
comment
более сложный, чем мой подход! - person Martin Frank; 19.01.2015

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

public static void MoToEng(String string2) {
    String[] splits = string2.split(" "); //you split the string into
                                           //String[] - delimiter = ' '


    String literal = ""; //this will be your result

    for (String split: splits){ //iterate through the String[] split

        splits = splits + " "; //your morse code ends with
                               //a blank - you have to add that 
                               //else equals() won't find 
                               //a suitable match
        //then look into your morse code
        for (int index = 0; index < morse.length(); index++){ 
            string code = morse[index];

            //if split looks like a morse code, you found your 
            //character
            if (split.equals(code){

                //translate back then
                literal = literal + ('A'+index);

            }
        }
    }
    System.out.println(literal);
}
person Martin Frank    schedule 19.01.2015

Почему бы вам не использовать Map<String,String> для хранения <morsecode,english alphabet> значений?

HashMap<String,String> map=new HashMap<String,String>();
//populate map
map.put(".- ","a");
map.put("-... ","b");

а затем в методе EngToMo(String string1)

public static void EngToMo(String string1){

for (Entry<String, String> entry : map.entrySet()) {
            if (entry.getValue().equals(string1)) {
                System.out.println(entry.getKey());
            }
        }
}

и в методе MoToEng(String string2)

public static void MoToEng(String string2){
 System.out.println(map.get(string2));
}
person Mustafa sabir    schedule 19.01.2015
comment
не забудьте разбить входную строку, прежде чем смотреть на карту! иначе вы не сможете разобрать все слово, а только отдельные буквы! - person Martin Frank; 19.01.2015
comment
Да, конечно, должны быть действительные входные проверки. Я просто предоставил пользователю схему для продвижения вперед. - person Mustafa sabir; 19.01.2015