Morse Code Conversion using Java

谁都会走 提交于 2020-01-14 14:45:14

问题


I'm trying to learn about hashmaps and 2D arrays in Java. We have an assignment due to have a scanner that accepts a string and converts it to morse code. The code we're using is based of a method full of if statements, but I want to learn how I would do something like this using lists, hashmaps, or 2D arrays. My code is as follows:

import java.util.*;

public class MorseConversion 
{


public static void main(String[] args) 
{

    Scanner userInput = new Scanner(System.in); 
    System.out.println("Please enter a phrase to convert to morse code: ");
    String userString = userInput.nextLine();
    System.out.println("");
    System.out.println(stringConvert(userString));
}


public static String stringConvert(String userString)
{
    String currentChar;
    String getMorseChar;
    String convertedString = "";

    for (int i = 0; i < userString.length(); i++)
    {
        //Get character at i position
        currentChar = userString.charAt(i) + "";  

        //convert character to morse code
        getMorseChar = convert(currentChar);

        //seperate words with the | symbol
        if (getMorseChar.equals(" "))
        {
            convertedString = convertedString + "  |  ";
        } 

        else 
        {
            //concat the converted letter
            convertedString = convertedString + getMorseChar;

            //Add a space between each letter
            if (!getMorseChar.equals(" ")) 
            {
                convertedString = convertedString + " ";
            }   
        }           
    }

    return convertedString;

}
 public static String convert (String toEncode)  
    {  
        String morse = toEncode;  

        if (toEncode.equalsIgnoreCase("a"))  
            morse = ".-";  
        if (toEncode.equalsIgnoreCase("b"))  
            morse = "-...";  
        if (toEncode.equalsIgnoreCase("c"))  
            morse = "-.-.";  
        if (toEncode.equalsIgnoreCase("d"))  
            morse = "-..";  
        if (toEncode.equalsIgnoreCase("e"))  
            morse = ".";  
        if (toEncode.equalsIgnoreCase("f"))  
            morse = "..-.";  
        if (toEncode.equalsIgnoreCase("g"))  
            morse = "--.";  
        if (toEncode.equalsIgnoreCase("h"))  
            morse = "....";  
        if (toEncode.equalsIgnoreCase("i"))  
            morse = "..";  
        if (toEncode.equalsIgnoreCase("j"))  
            morse = ".---";  
        if (toEncode.equalsIgnoreCase("k"))  
            morse = "-.-";  
        if (toEncode.equalsIgnoreCase("l"))  
            morse = ".-..";  
        if (toEncode.equalsIgnoreCase("m"))  
            morse = "--";  
        if (toEncode.equalsIgnoreCase("n"))  
            morse = "-.";  
        if (toEncode.equalsIgnoreCase("o"))  
            morse = "---";  
        if (toEncode.equalsIgnoreCase("p"))  
            morse = ".--.";  
        if (toEncode.equalsIgnoreCase("q"))  
            morse = "--.-";  
        if (toEncode.equalsIgnoreCase("r"))  
            morse = ".-.";  
        if (toEncode.equalsIgnoreCase("s"))  
            morse = "...";  
        if (toEncode.equalsIgnoreCase("t"))  
            morse = "-";  
        if (toEncode.equalsIgnoreCase("u"))  
            morse = "..-";  
        if (toEncode.equalsIgnoreCase("v"))  
            morse = "...-";  
        if (toEncode.equalsIgnoreCase("w"))  
            morse = ".--";  
        if (toEncode.equalsIgnoreCase("x"))  
            morse = "-..-";  
        if (toEncode.equalsIgnoreCase("y"))  
            morse = "-.--";  
        if (toEncode.equalsIgnoreCase("z"))  
            morse = "--..";  
        if (toEncode.equalsIgnoreCase("0"))  
            morse = "-----";  
        if (toEncode.equalsIgnoreCase("1"))  
            morse = ".----";  
        if (toEncode.equalsIgnoreCase("2"))  
            morse = "..---";  
        if (toEncode.equalsIgnoreCase("3"))  
            morse = "...--";  
        if (toEncode.equalsIgnoreCase("4"))  
            morse = "....-";  
        if (toEncode.equalsIgnoreCase("5"))  
            morse = ".....";  
        if (toEncode.equalsIgnoreCase("6"))  
            morse = "-....";  
        if (toEncode.equalsIgnoreCase("7"))  
            morse = "--...";  
        if (toEncode.equalsIgnoreCase("8"))  
            morse = "---..";  
        if (toEncode.equalsIgnoreCase("9"))  
            morse = "----.";  
        if (toEncode.equalsIgnoreCase("."))  
            morse = ".-.-";  
        if (toEncode.equalsIgnoreCase(","))  
            morse = "--..--";  
        if (toEncode.equalsIgnoreCase("?"))  
            morse = "..--..";  

        return morse;  
    }  

 }

I'm doing this strictly out of curiosity. I have had it pounded into my head that redundancy like this is a huge no-no. Thanks in advance!


回答1:


The easier way to do it is to have an initializer that loads your characters into a hash map using the letter as the key. Then as your looping the characters in your input string your simply doing

at the beginning of you class do something like this:

private static HashMap<String, String> codes = new HashMap<String, String>();
    static{
        codes.put("a", ".-");
        codes.put("b", "-...");
        bla bla bla
    }

then in your loop where you have

//convert character to morse code
        getMorseChar = convert(currentChar);

you would have

getMorseChar = code.get(currentChar.toLowerCase());

no more nasty elseif statement.




回答2:


Here is the Optimized Code which Gives a Clear Understanding of 2-D Arrays

public class MorseCode {
public static Scanner sc;
public static void main(String args[]) throws IOException  //Input Output Exception is added to cover the BufferedReader 
{
    int option = 0;
    String sentence = "",answer = "",answer1 = "";
     char[] english = { '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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
             ',', '.', '?' };   //Defining a Character Array of the English Letters numbers and Symbols so that we can compare and convert later 

     String[] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", 
                ".---", "-.-", ".-..", "--", "-.", "---", ".---.", "--.-", ".-.",
                "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----",
                "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.",
                "-----", "--..--", ".-.-.-", "..--.." };  //Defining an Array of String to hold the Morse Code value of Every English Letter,Number and Symbol in the same order as that of the character Array  
    sc = new Scanner(System.in);
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println(">>>>Welcome to MorseCode Software<<<<");
    System.out.println("");
    do
    {
    System.out.println("-->Enter the Option Corresponding to the Task you want to Perform ");
    System.out.println("->1.Generate Morse Code<- OR ->2.Generate English Language<- OR ->3.Exit ");
    System.out.print("->");
    while(!sc.hasNextInt())  //Repeat Until the next Item is an Integer i.e Until the Next Item is an Integer Keep on Repeating it 
    {//NOTE- The hasnext() function is also used when we are using the Iterator where the next input is always checked and then if it is valid it is allowed to be entered 
        System.out.println("");
        System.err.println("-->ERROR<-->Enter Digits Only<--");
        System.out.print("->");
        sc.next();   //Repeat and Discard the previous Inputs which are not valid 
    }
    option = sc.nextInt();
    switch(option)
    {
    case 1:
    {
        System.out.println("");
        System.out.println("-->Enter the Sentence that you want to Transmit Using the Morse Code ");
        System.out.print("->");
        sentence = br.readLine();
        System.out.println("");
        sentence = sentence.toLowerCase(); //Because morse code is defined only for the lower case letters and the numbers and the Symbols will remain the Same
        char[] morsec = sentence.toCharArray();
        for(int i = 0; i < morsec.length;i++)  //The loop will run till i is less than the number of characters in the Sentence because Every Character needs to Be Converted into the Respective Morse Code 
        {//For Every Letter in the User Input Sentence
            for(int j = 0;j<english.length;j++)   //For Every Character in the morsec array we will have to traverse the entire English Array and find the match so that it can be represented 
            {
                if(english[j] == morsec[i])  //If the Character Present in English array is equal to the character present in the Morsec array then Only Execute 
                {//Always remember that the condition in the Inner loop will be the first to be Equated in the If Statement because that will change until the characters match 
                    answer = answer + morse[j] + " ";  //After Every Letter is generated in the Morse Code we will give a Space 
                }  //Since the Letters in the English char and the symbols present in the morse array are at the Same Index 
            }
        }
        System.out.println("-->The Morse Code Translation is:- ");
        System.out.print(">> ");
        System.out.println(answer);
        System.out.println("");
        break;
    }
    case 2:
    {
        System.out.println("");
        System.out.println("-->Enter the Morse Code and After Every Letter add Space in Between ");
        System.out.print("-> ");
        sentence = br.readLine();
        System.out.println("");
        String[] morsec = sentence.split(" ");   //To use the split function to Convert Every Morse Code String as a Separate Entry in the STring array 
        for(int i = 0;i < morsec.length;i++)
        {//For Every morse code Letter Entered 
        //Remember - We are Splitting on the Basis of the space     
            for(int j = 0;j < morse.length;j++)
            {
                if(morse[j].equals(morsec[i]))  //When you are comparing the String you have to Do this and not == 
                {
                    answer1 = answer1 + english[j];  //Since the characters in the Morse array and the English Array are in the Same Index
                }
            }
        }
        System.out.println("-->The English Language Translation is:- ");
        System.out.print(">> ");
        System.out.println(answer1);
        System.out.println("");
        break;
    }
    case 3:
    {
        System.out.println("");
        System.out.println(">>Thank you For Using this Service<<");
        System.out.println("");
        break;
    }
    default:
    {
        System.err.println("-->ERROR<-->Invalid Option Entered<--");
        System.out.println("");
        break;
    }
    }
    }
    while(option!=3);
    }

}

Hope There is No Confusion to the Code



来源:https://stackoverflow.com/questions/15101912/morse-code-conversion-using-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!