将英语转换成摩尔斯电码

Convert English into MorseCode

这个java代码是将英文转换成摩尔斯电码。

当用户输入标记字符 $ 时,该程序将终止。在输入每个字符串之后,程序会显示其对应的摩尔斯电码,在字符之间留一个空白 space (ø),在单词之间留两个 øø。

EG。你好世界。输出应为 ....ø.ø.-..ø.-..ø---ø.--ø---ø.-.ø.-..ø-..

我的代码有一些问题。 1.I 用户输入 ø 时不知道应该把 $ 放在哪里来终止程序; 2.The 输出正确但总是以 (ø) 结尾,因为 System.out.print(code[variable] + "ø");

这是我的代码:

public class Morse{
public static void main (String [] args)
{
    Scanner englishtomorse = new Scanner(System.in);
    System.out.println ("Please enter an original sentence in English.");
    english = englishtomorse.nextLine();
    String str = englishtoMorse(english);
    System.out.println(str);
}

public static String englishtoMorse(String english)
{
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String code[] =  {"._", "_...", "_._.", "_..",".",".._.","__.", "....",
        "..", ".___", "_._", "._..", "__","_ .", "___", ".__.", "__._", "._.",
        "...", "_", ".._", "..._", ".__", "_.._", "_.__", "__.."};
    english = english.toUpperCase();
    for(int xyz = 0; xyz < english.length(); xyz++)
    {
        char letter = english.charAt(xyz);
        if (letter == ' ')
        {
            System.out.print ("ø");
            continue;
        }
        for(int variable = 0; variable < alphabet.length(); variable++)
        {
            if(alphabet.charAt(variable) == letter)
            {
                System.out.print(code[variable] + "ø");
                break;
            }
        }
    }
    return " ";
}

您的代码存在一些您应该注意的问题。

  1. 看看Sun/Oracle's naming convention。它使代码更容易阅读。驼峰式是必须的。

  2. Scanner 被视为 Java 上的资源。所以如果你打开它,你必须关闭它。否则,您可能会遇到资源泄漏问题。关闭资源只是一个简单的方法调用,但它不应该被忽略。

例如:

resourceVariableName.close().
  1. 第三行英文的变量声明在哪里?

english = englishtomorse.nextLine();


第一个问题:

Scanner 将继续读取,直到找到 Java SE API

中所述的文件结束条件

通常的做法是使用Scanner在循环内处理数据并在满足文件结束条件或找到"special"退出词时停止下一个操作。

因此您可以重构代码以考虑以下情况:

  • 扫描仪发现不止一行

  • 用户没有输入您保留的退出词($)

例如:

Scanner myScanner = new Scanner(System.in);

while(myScanner.hasNext() && !myScanner.equals("$")) {
    System.out.println(this.englishToMorse(myScanner.nextLine()));
}

myScanner.close();

第二个问题,你应该检查你的方法逻辑。你声明你 return 一个 String 但它总是

returns " ";

为什么在任何情况下都应该 return 空字符串?方法签名很重要,因为您可以预测该方法能够做什么以及必须做什么 return。

想一想,如果你把这个 class 提供给一个朋友,他调用了你的方法,他怎么能预测你不会 return 你上面写的莫尔斯电码方法签名 return 类型?

顺便说一下,你可以用更好的方法解决这个问题,而不用循环两个数组。看看Map data structure。这是对您的整体解决方案的巨大改进。