1

私は、プログラミング入門クラスの簡単なモールス符号翻訳に取り組んでいます。これは私が教えられたテクニックに基づいた非常にシンプルなデザインです。

このプログラムは、1 文字の変換には機能しますが、単語や文には変換できません。問題はmorse[index]最後のステートメントに関係していると思いますが、翻訳されたテキスト全体を印刷する方法がわかりません。

public class Exercise12_9
{
    public static void main(String[] args)
    {
        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 = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", 
                ".---", "-.-", ".-..", "--", "-.", "---", ".---.", "--.-", ".-.",
                "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----",
                "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.",
                "-----", "--..--", ".-.-.-", "..--.." };


        Scanner keyboard = new Scanner(System.in);

        String userInput;

        int index;

        index = 0;

        System.out.println(" This is an English to Morse Code Translator.  ");
        System.out.println(" Please enter what you would like translate ");
        System.out.println("             into Morse Code. ");
        System.out.println(" ============================================ ");

        userInput = keyboard.next();

        userInput = userInput.toLowerCase();

        for (index = 0; index < userInput.length(); index++)           
        {
            char [] chars = userInput.toCharArray();

            if (userInput.equals(english[index]))
            {    
                System.out.println(" Translated : " + morse[index]);       
            }
        }  
    }
}
4

7 に答える 7

2

ここで対処する必要があることがいくつかあるので、見てみましょう。

入力

Scanner.next()次のトークンのみを与えるだけです。あなたの場合、文字列全体が必要です。Scanner.nextLine()代わりに使用してみてください。

翻訳ロジック

コードが現在存在する方法では、入力をステップ実行していますが (正しい)、入力の各文字に対して、モールス符号で同等のものをフェッチしていません! 代わりに、入力全体を の単一の英字と比較していますenglish[index]。ロジックを修正するための提案については、以下を参照してください。

出力

また、各文字の後に翻訳された文字列を出力していることにも注意してください。これは、やりたくないことだと思います。

提案

あなたへのいくつかの提案:

  1. 入力でスペース文字を処理したい場合は、それを配列に追加してください!
  2. 英語とモールス文字をMapに保存することを強くお勧めします。このようにして、英語の文字に相当するモールスを非常に簡単に検索できます。必要に応じて配列はまだ問題ありませんが、初期化後に次を追加することをお勧めします。

    final Map<String, String> mapping = new HashMap<String, String>();
    for (int i = 0; i < english.length; ++i) {
        mapping.put(english[i], morse[i]);
    }
    

    これで、 を使用してループ内のモールス文字を検索できますmapping.get(String.valueOf(userInput.charAt(index)))

  3. 出力を構築するには、StringBuilderを使用することをお勧めします。したがって、ループ内の反復ごとに 、builder.append(...)印刷する準備ができたら、次を使用できますbuilder.toString()

これは間違いなくコードレビューにより適した回答でしたが、ロジックの問題に回答しました. お役に立てれば!

于 2015-04-17T18:50:04.040 に答える
1

これがあなたの解決策になると思います。

Scanner keyboard = new Scanner(System.in);
    String  userInput = keyboard.nextLine();

    String output;
    for (index = 0; index < userInput.length(); index++)           
      {
         if (Arrays.asList(english).contains(userInput[index]))
         {        
             output+=morse[index];
         }
      } 
    System.out.println(" Translated : " +  output); 
于 2015-04-17T18:39:13.603 に答える
1

このようなことを達成しようとしていると思います。あなたは良い道を歩んでいましたが、あなたのコードについて私が持っているいくつかの指針を見る必要があります.

  1. まず、英語の英数字の文字列の配列を作成しました。ユーザーからの入力を取得して char に分割するため、代わりに char の配列を作成する必要があります。ユーザー入力を配列と比較しようとしていたので、something.equals(something else) を使用していました --> これは String のメソッドです。これで、==比較記号を使用して比較する 2 つの文字ができました。
  2. 変数を開始し、その開始値を同じ行で宣言することをお勧めします (コード行を減らします)。同じことが for ループにも当てはまり、ループ宣言でインデックス変数を直接開始します。i(通常、変数の代わりに文字で始まりますindex)。
  3. 最後のダブルfor loopは、入力のすべての文字を英語の文字と数字のすべての文字と比較するために必要です。
  4. 以下に示す回答ではString str、モールス値を連結するために a を使用しました。次に、その値を出力するだけです。

私はあなたのコードを少し変更しましたが、いろいろ試してみて、それが作成するさまざまな出力を確認してください。これは、指定されたコードから学ぶための最良の方法です。

学習頑張ってください

public static void main(String[] args){

    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',
                  ',', '.', '?' };

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

    //Scanner keyboard = new Scanner(System.in);

    System.out.println(" This is an English to Morse Code Translator.  ");
    System.out.println(" Please enter what you would like translate ");
    System.out.println("             into Morse Code. ");
    System.out.println(" ============================================ ");

    //String userInput = keyboard.nextLine().toLowerCase();
    String userInput = "TEST".toLowerCase();

    char[] chars = userInput.toCharArray();

    String str = "";
    for (int i = 0; i < chars.length; i++){
        for (int j = 0; j < english.length; j++){

            if (english[j] == chars[i]){
                str = str + morse[j] + " ";  
            }
        }
    }
    System.out.println(str);
} 
于 2015-04-17T18:54:28.857 に答える
0

のJavaドキュメントを見ると、次のトークンのみを返すScanner.Next()ことに気付くでしょう。単一のトークンではなく、テキスト行を取得するためにnext使用します。Scanner.nextLine()

于 2015-04-17T18:28:58.420 に答える
0

双方向トランスレーター(モールスString<=>英語) を使用していて、Java Streamアプローチを好む場合は、英語の文字配列を維持する方が良いと思います。参照用のこの質問) は、ストリーム アプローチをもう少し混乱させます。charchar

public class MorseCode {

    private static final 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",
        ",", ".", "?", "!", ":", "@", "=", "-", "+", "\"", "/", "&",
        "'", "(", ")"
    };

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

    private static final Map<String, String> EN_TO_MORSE = new HashMap<>();
    private static final Map<String, String> MORSE_TO_EN = new HashMap<>();

    static {
        for (int i = 0; i < english.length; i++) {
            EN_TO_MORSE.put(english[i], morse[i]);
            MORSE_TO_EN.put(morse[i], english[i]);
        }
    }

    public static void main(String[] args) {

        String output;

        output = MorseCode.run(false, "Hello, World!");
        System.out.println(output); // .... . .-.. .-.. --- --..-- / .-- --- .-. .-.. -.. -.-.--

        output = MorseCode.run(true, ".... . .-.. .-.. --- --..-- / .-- --- .-. .-.. -.. -.-.--");
        System.out.println(output); // hello, world!
    }

    private static String run(boolean codeToEnglish, String input) {

        if (input == null || input.length() == 0)
            throw new IllegalArgumentException("Invalid input");

        String wordSplitter, wordJoiner, charSplitter, charJoiner;
        Map<String, String> mapper;
        
        if (codeToEnglish) {
            wordSplitter = " / ";
            wordJoiner = " ";
            charJoiner = "";
            charSplitter = " ";
            mapper = MORSE_TO_EN;
        } else {
            wordSplitter = " ";
            wordJoiner = " / ";
            charJoiner = " ";
            charSplitter = "";
            mapper = EN_TO_MORSE;
        }

        return Arrays
            .stream(input.trim().toLowerCase().split(wordSplitter))
            .map(word -> createWord(word, charJoiner, charSplitter, mapper))
            .collect(Collectors.joining(wordJoiner));
    }

    private static String createWord(String word, String joiner, String splitter, Map<String, String> mapper) {
        return Arrays.stream(word.split(splitter)).map(mapper::get).collect(Collectors.joining(joiner));
    }

}
于 2021-01-24T13:22:48.317 に答える