1

モールス信号を英語に変換するのに助けが必要です. 私はすでに英語をモールス語に翻訳するためのコードを書き、テストしました。私の主な問題は、モールス符号のすべての文字を英語の文字に変換する前にまとめることです。

例: "。" は E に変換され、... は S に変換されますが、... に到達するまで翻訳を開始したくありません。

いくつかのルール -モールス文字を区切るためにスペースが使用されます -| 単語を区切る区切り文字として使用されます-ハッシュマップを使用できません:(

これが私のコードです

import java.util.Arrays;
import javax.swing.JOptionPane;

public class test3
{
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 & decide whether to convert to Morse or English
    String phrase = JOptionPane.showInputDialog("Enter the words you wish to translate.");

    if ( decide.equals( s1 ))
        toMorse( phrase );

    else
        toEnglish( phrase );
}

// Translate to Morse
public static void toMorse( String preTranslation )
{

    String[] 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"};

    String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..", ".---",
            "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-", 
            "...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};
    // Remove uppercase
    String preTrans = preTranslation.toLowerCase();

    // Deletes spaces
    String phraseWithDelimiter = preTrans.replace( " ", "|");

    String[] translation = new String[phraseWithDelimiter.length()];
    String[] delimiter = {"|"};

    // Translate 
    for ( int arrayVar = 0, transArrayVar = 0, subStringVarB = 0, subStringVarE = 1; transArrayVar < phraseWithDelimiter.length();)
    {
        if( phraseWithDelimiter.substring(subStringVarB, subStringVarE).equals( delimiter[0] ) )
        {
            translation[transArrayVar] = delimiter[0];
            transArrayVar++;
            subStringVarB++;
            subStringVarE++;
        }
        else if ( phraseWithDelimiter.substring(subStringVarB, subStringVarE).equals( english[arrayVar] ) )
            {
                translation[transArrayVar] = morse[arrayVar];
                transArrayVar++;
                subStringVarB++;
                subStringVarE++;
                arrayVar = 0;
            }
            else
            {
                arrayVar++;
                if ( arrayVar == 35 )
                {
                    arrayVar = 0;
                    subStringVarB++;
                    subStringVarE++;
                    transArrayVar++;
                }
            }
    }
String morseSeparator = new String( " " );
arrayToString ( translation, morseSeparator );

}


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

    // unfinished
public static void toEnglish( String preTranslation)
{
    }

forステートメントを作成し、モールス符号のすべての文字を空白に到達するまで新しい文字列に割り当て、それを使用してテストすることを考えていましたが、その方法がわかりません。

どんな助けでも感謝します!

4

2 に答える 2

3

すべてのモールス符号シーケンスを最長から最短の順に含む正規表現を作成します。

 Pattern.compile("----\\.|-----|---\\.\\.|...")

次に、それを文字列と繰り返し照合して、最長の有効なモールス符号シーケンスを取得します。


または、 JavaCCなどのパーサー コンパイラを使用できます。

SKIP : { " " }
TOKEN : { < A : "-." > }
TOKEN : { < B : "-..." > }
TOKEN : { < C : "-.-." > }
...

String translate() :
{ StringBuilder sb; }
{
  { sb = new StringBuilder(); }

  (
    letter(sb)
  )*
  <EOF>

  { return sb.toString(); }
}

void letter(StringBuilder sb) :
{}
{
  ( <A>
    { sb.append('a'); }
  | <B>
    { sb.append('b'); }
  | <C>
    { sb.append('c'); }
  ...
  )
}
于 2012-08-23T16:47:56.250 に答える
1

テキストを翻訳するには、最初に単語区切り記号で分割してから、文字制限記号で分割してみてください。次に、単語を 1 つずつ処理します。これに似ています:

String morseInput = //whatever, only delimiters or morse characters

String[] words = morseInput.split("-|");
for( String word : words ) {
  String[] characters = word.split("\\s");

  for( String c : characters ) {
    //look up the english character for c - I'd use a map here
  }
}

いくつかのメモ:

  • 簡潔にするために、空の文字列と null のチェックを省略しました
  • また、最終的な翻訳文字列を作成するためのコードも省略しました。これは練習問題です。
  • 検索にaMap<String, String>を使用しますが、それが許可されていない場合は、ソース配列内の文字のインデックスを検索し、翻訳配列からそのインデックスで翻訳を取得します
于 2012-08-23T16:43:10.740 に答える