0

我正在研究英语到莫尔斯语的翻译器。当我用英语输入我的句子时,我收到一个充满“空”而不是相应的莫尔斯字符的翻译。

结果如下所示:“null|null|null|null|null”。|是莫尔斯字符的分隔符。我如何摆脱空值?这是我的代码:

(是的,这是家庭作业。)

import javax.swing.JOptionPane;

public class test
{
public static void main ( String [] args )
{
    String s1 = "Morse";

    //Decide whether Morse code or English
    String decide = JOptionPane.showInputDialog("Enter 'English' for Morse to English code translation and 'Morse' for English to Morse code translation. Pay attention to Caps.");

    //Enter String
    String phrasep = JOptionPane.showInputDialog("Enter the words you wish to translate.");

    if ( decide.equals( s1 ))
        toMorse( phrasep );
    else
        toEnglish( phrasep );
}

// Translate to Morse
public static void toMorse( String phrase1 )
{
    char[] english = new char[36];

    for (  int i = 65, j = 0; i < 91; i++, j++) {
        english[j] = (char)i;
    }

    english[26] = 1;
    english[27] = 2;
    english[28] = 3;
    english[29] = 4;
    english[30] = 5;
    english[31] = 6;
    english[32] = 7;
    english[33] = 8;
    english[34] = 9;
    english[35] = 0;

    String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..", ".---",
            "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-", 
            "...-",".--","-..-","-.--","--.."};

    //Replace spaces with |
    String phrase = phrase1.replace( "//s+", "|");

    String[] translation = new String[phrase1.length()];

    //Translate
    for ( int j = 0, t = 0, n = 1; j < phrase.length(); j++) {
        if ( phrase.substring(t, n ).equals ( english[j] ) ) {
            translation[t] = morse[j];
            t++;
            n++;
        }
    }

    String separatorp = new String( "|" );
    arrayToString ( translation, separatorp );
}

public static void toEnglish( String phrase) {
    System.out.println( phrase );
}

//Convert array to string and print translation
public static void arrayToString(String[] trans, String separator) 
{
    String result = "";
    if (trans.length > 0) {
            result = trans[0];    // start with the first element
            for (int i = 1; i < trans.length; i++)
                    result = result + separator + trans[i];
        }
    System.out.println ( result );
}
}
4

2 回答 2

1

关于如何编写这个程序存在很大的困惑。让我们考虑一下您的核心功能:

public static String toMorse(String english) { ... }

与您的实现不同,请注意它返回一个字符串。这是因为您给它一个字符串(英语短语),而您想要返回另一个字符串(莫尔斯短语)。始终首先考虑您的数据是什么,然后在该数据上编写函数。不要写函数,想想你的数据是什么。

现在考虑实现此功能的基本部分,您的版本在这里:

//Translate
for ( int j = 0, t = 0, n = 1; j < phrase.length(); j++) {
    if ( phrase.substring(t, n ).equals ( english[j] ) ) {
        translation[t] = morse[j];
        t++;
        n++;
    }
}

首先,你为什么要实例化三个你没有命名的变量(所以他们的意思对于第一次看它的人来说是不清楚的)并且你以同步方式增加它们?以下做同样的事情:

//Translate
for ( int j = 0, t=0; j < phrase.length(); j++) {
    if ( phrase.substring(t, (t+1) ).equals ( english[j] ) ) {
        translation[t] = morse[j];
        t++;
    }
}

但目前还不清楚从名字上是做什么j和做什么的。t当您进行逐个字符的转换时,您实际上是在将它们用作索引。如果我们查看 Java String API,我们会看到您正在使用 substring() 来获取特定字符...除了您的起点和终点是jand j+1,这意味着您将始终获得两个字符。两个字符永远不会匹配一个字符。

上面链接的文档显示了检索字符的另一个选项。

当我们这样做时,请注意:

  • 如果您遵循良好的编程风格,您的分隔符应该存储为常量,而不是硬编码到您的函数中。
  • 在一个地方,您replace()用来用另一个地方替换特定事物的实例。其次,您正在详尽地遍历一个 n 长度的列表以寻找特定的匹配项。使用一种方法或另一种方法。在这里使用两者都是不合适的并且令人困惑。
  • 您的翻译时间为 O(n*m),其中 n 是短语的长度,m 是字母表中的字母数。通常这将被认为是 O(n^2),这是不好的。Map确实是您想要的,因为它是 O(1) 访问时间,将您的函数减少到 O(n),其中 n 是您的短语的长度。
  • 您的变量需要明确命名,以便您清楚地知道它们的作用。命名它们的行为将迫使你直截了当地记住它们的意思。
  • 您应该在您使用它们的功能之外设置您的字典。这样您就可以独立于您的翻译功能检查它们的正确性。

我最后的建议是,你可以远离代码,尝试用简单的英语写出进行这种转换的说明。您似乎对阻止您解决手头问题的细节(例如将文本粘贴到摇摆前端)感到困惑:如何正确地将短语从一种语言翻译成另一种语言。

于 2012-08-17T22:59:13.867 回答
0

Add some "System.out.println" will help you to understand what's wrong in your code. Please focus on:

for ( int j = 0, t = 0, n = 1; j < phrase.length(); j++)
{

    if ( phrase.substring(t, n ).equals ( english[j] ) )
    {
        translation[t] = morse[j];
        // Try add one line:
        System.out.println(translation[t];
        t++;
        n++;
    }
}

By the way, do you use eclipse or NetBeans, etc? If not, you probably learn one of them.

于 2012-08-17T22:55:12.110 回答