Английский - Морзе Переводчик

Перевод с Морзе на английский работает как заклинание, однако перевод фразы или предложения (несколько слов, разделенных пробелом) с английского на Морзе дает только первое слово, переведенное на Морзе. Например, если бы я ввел «Hello World», переводчик вернул бы только

'.... . .-.. .-.. --- '.

Что мне нужно изменить, чтобы получить полное предложение от переводчика? Я указал, где, по моему мнению, проблема, и обратите внимание, что переводчик игнорирует пунктуацию. ТИА

import java.util.Scanner;

public class JavaProgram
{
    //made them static so they can be accessed from static functions
    private final static char[] ABC = {'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', ' '};

    private final static String[] MORSE = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
        ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",  ".-.", "...", "-", "..-",
        "...-" ,".--" ,"-..-", "-.--", "--..", "|"};

    public static void main(String [] args)
    {     
        Scanner scan = new Scanner( System.in );
        System.out.print("If you want to convert from Morse to English, type 'M', if you would like to convert from English to Morse, type 'E': ");
        String answer = scan.nextLine();
        if( answer.equals("E"))
        {
            Scanner scan2 = new Scanner(System.in);
            System.out.print("Enter a word or phrase in English: ");
            String englishInput = scan.next();
            System.out.println(toMorse(englishInput));
            scan2.close();
        }
        if (answer.equals("M"))
        {           
            Scanner scan3 = new Scanner(System.in);
            System.out.print("Enter a word or phrase in Morse: ");
            String morseInput = scan.nextLine();
            System.out.println(getABC(morseInput));
            scan3.close();
                }
        scan.close();
        }


    private static String toMorse(String ABCString)
    {
        String morseString = "";
        for (char c : ABCString.toLowerCase().toCharArray()) 
        {
            morseString += charToMorse(c) + " ";
        }
        return morseString;
    }

    //**I am fairly certain the problem is in this method.**
    private static String charToMorse(char c)
    {
        for(int i = 0; i < ABC.length; ++i)
        { 
            if (c == ABC[i])
            {
                return MORSE[i];
            }
        }
        return String.valueOf(c); 
    }


    private static String getABC(String morseString)
    {
        String ABCString = "";
        for (String s : morseString.split("\\s")) 
        {
            ABCString += characterToABC(s);
        }
        return ABCString;
    }


    private static String characterToABC(String s)
    {
        for (int i = 0; i < MORSE.length; ++i) 
        {
            if (s.equals(MORSE[i])) 
            {
                return String.valueOf(ABC[i]); 
            }
        }
        return s; 
    }
}

person frgnvola    schedule 11.06.2014    source источник
comment
Что делает Scanner#next()? Что делает Scanner#nextLine()?   -  person Sotirios Delimanolis    schedule 11.06.2014


Ответы (1)


Я полагаю, на основе http://www.tutorialspoint.com/java/util/scanner_next.htm (определение java.util.Scanner.next), что ваша String englishInput = scan.next();строка в этом разделе:

if( answer.equals("E"))
{
    Scanner scan2 = new Scanner(System.in);
    System.out.print("Enter a word or phrase in English: ");
    String englishInput = scan.next();
    System.out.println(toMorse(englishInput));
    scan2.close();
}

читает только первый токен, который является первым словом, поскольку одиночные пробелы ЯВЛЯЮТСЯ пробелами, в отличие от вашего nextLine(), который правильно принимает все предложение.

person EchoAce    schedule 11.06.2014