0

私は英語からモールス信号への翻訳者に取り組んでいます。英語で文章を入力すると、対応するモールス文字ではなく「null」で埋められた翻訳が表示されます。

結果は次のようになります: "null | 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) { ... }

実装とは異なり、文字列を返すことに注意してください。これは、1つの文字列(英語のフレーズ)を指定し、別の文字列(モールス信号)を戻したいためです。常に最初にデータが何であるかを考え、そのデータに関数を記述してください。関数を記述して、データが2番目であるかどうかを考えないでください。

ここで、この関数の実装の重要な部分、ここでのバージョンについて考えてみましょう。

//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++;
    }
}

まず、なぜ3つの変数をインスタンス化するのですか?名前を付けられず(つまり、最初にそれを見る人には意味がわかりません)、ロックステップで増加しますか?以下は同じことをします:

//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()を使用して特定の文字を取得していることがわかります...ただし、開始点と終了点はjandj+1です。つまり、常に2文字を取得することになります。2つの文字が1つの文字と一致することはありません。

上にリンクされているドキュメントは、文字を取得するための別のオプションを示しています。

私たちがそれに取り組んでいる間、注意してください:

  • 優れたプログラミングスタイルに従っている場合は、区切り文字を関数にハードコーディングするのではなく、定数として格納する必要があります。
  • ある場所replace()で、特定のもののインスタンスを別のものに置き換えるために使用しています。次に、特定の一致を探してn長のリストを徹底的にトラバースしています。いずれかの方法を使用してください。ここで両方を使用することは不適切であり、混乱を招きます。
  • 翻訳時間はO(n * m)です。ここで、nはフレーズの長さ、mはアルファベットの文字数です。一般的にこれはO(n ^ 2)と見なされますが、これは悪いことです。マップは本当に必要なものです。これは、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 に答える