Java:摩尔斯电码转换器

时间:2009-12-06 20:28:37

标签: java morse-code

我正在尝试将摩尔斯电码转换为文字。

我有两个文本文件用于此问题。 morseCode.txt:我有一个我读过的文件,其中包含相应的字母和相应的摩尔斯电码。

morse.dat:包含摩尔斯电码

中加密邮件的文件

我能够正确读取第一个文件然后存储到单独的数组中。我通过打印字母和数组莫尔斯代码来测试它,发现它确实按顺序存储它。

我在阅读第二个文件时遇到问题。 这是morseCode.txt键:

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   --..
0   ----- 
1   .---- 
2   ..--- 
3   ...-- 
4   ....- 
5   ..... 
6   -.... 
7   --... 
8   ---.. 
9   ----. 
.  .-.-.- 
,   --..-- 
?   ..--.. 

这就是Message.txt文件的样子:

    - .... .. ... 
.. ... 
.- 
- . ... - 
.--. .-. --- --. .-. .- -- .-.-.- 
.. ..-. 
-.-- --- ..- 
... . . 
- .... .. ... 
-- . ... ... .- --. . 
- .... .- - 
.. ... 
--. --- --- -.. 
-. . .-- ... 
-.-- --- ..- .-. 
.--. .-. --- --. .-. .- -- 
.-- --- .-. -.- ... .-.-.- 

它应该输出:

THIS IS A TEST PROGRAM.
IF YOU SEE THIS MESSAGE THAT IS GOOD NEWS YOUR PROGRAM WORKS.

+++这是我的解决方案。+++

/*     
 *This is a program that translates Morse Code to English text. The key is read from a file. 
 *
 *The file contains the equivalent letters and Morse code. The entire key is stored in an array for reference. 
 *
 *A second file contains the encrypted message. The program reads the message file and converts individual Morse code 
 *
 *letters into alphabet letters. The results are displayed and printed out to another file. */

import java.io.*;
import java.util.Scanner;

//file writer and print writer to save the output
public class Assignment4
{
 @SuppressWarnings("null")
 public static void main (String [] args) throws IOException
 {
  //arrays for letters and Morse Code values
  String[] letter = new String[39], morseCode = new String[39];     
  //this is the file with the letters and morse code equivalent
  File file1 = new File ("c:/morseCode.txt");
  Scanner in = new Scanner(file1);  

  int i = 0;

  while (in.hasNext())
        {
            //read in letter
   letter[i] = in.next();   
   //read in Morse Code
            morseCode[i] = in.next();          

            i++;
        }

  //this is the file with encrypted message
  String morseLine, morseLetter, theLetter = " ";  
  //this file contains the encrypted message
  File file2 = new File ("c:/morse.dat");
  Scanner data = new Scanner(file2);

  //this appends the data to the file and keeps a running input 
  FileWriter fWriter = new FileWriter("c:/Message.txt", true);
  PrintWriter outPutFile = new PrintWriter(fWriter);

  boolean found; 
  int  number = morseCode.length; 

  while (data.hasNext())
  {
   //reads each line of mesage
   morseLine = data.nextLine(); 

   i = 0; 
   int j = 0,  k = 0;      
   j = morseLine.indexOf(" ");   

   while (j != -1)
   {
    //determines the end of a letter in Morse code and stores the 
    morseLetter = morseLine.substring(i, j);

    found = false;    
    k = 0;    
    theLetter = " ";

    //this loop searches the array of morseCode for the equal Morse code letter
    //then it assigns the corresponding letter that is equivalent
    while (k < number && !found)
    {
     if (morseLetter.equals(morseCode[k]))
     {
      theLetter = letter[k];      
      found = true;
     }

     else
     {
      k++;
     }
    }

    //this condition prints the equivalent letter of the Morse code letter
    //on the message
    if (!theLetter.equals(" "))
    {
     System.out.print(theLetter);     
     outPutFile.print(theLetter);
    }

    i = j + 1;    
    j =  morseLine.indexOf(" ", i);    
   }   

   if(theLetter.equals("."))
   {
    //moves to the next line at the end of the sentence
    System.out.println(""); 
    outPutFile.println("");
   }

   else
   {
    //this separates the letters into words
    System.out.print(" "); 
    outPutFile.print(" ");
   }
  }

  outPutFile.close();
    }
}

2 个答案:

答案 0 :(得分:3)

使用Scanner解析morse.dat文件时会遇到问题,因为有两种类型的分隔符 - 空格和新行。最简单的方法可能是使用BufferedReader一次读取一行,并在空格上分割行。这是执行此操作的代码。我避免使用方法,因为你还没有了解它们。

import java.io.*;
import java.util.*;

public class Assignment4
{
    public static void main(String[] args) throws IOException
    {
        Map<String, String> morseCodes = new HashMap<String, String>();
        File file1 = new File ("morsecode.txt");
        Scanner in = new Scanner(file1);  

        while (in.hasNext())
        {
            String letter = in.next();          
            String code = in.next();   
            morseCodes.put(code, letter);
        }

        File morseCode = new File("message.txt");
        BufferedReader bufferedReader = new BufferedReader(new FileReader(morseCode));
        String line;

        while ((line = bufferedReader.readLine()) != null)
        {
            String letter = "";

            for (String morseLetter: line.split(" "))
            {
                letter = morseCodes.get(morseLetter);
                System.out.print(letter);
            }

            if (letter.equals(".")) {
                // Insert a new line after a period.
                System.out.println();
            } else {
                // Insert a space between words.
                System.out.print(' ');
            }
        }
    }
}

以上程序的输出:

THIS IS A TEST PROGRAM.
IF YOU SEE THIS MESSAGE THAT IS GOOD NEWS YOUR PROGRAM WORKS.

我希望能帮到你!

答案 1 :(得分:2)

while (data.hasNext())
{
   //read in letter
           words[e] = message[e].indexOf(" ");

考虑到您将文件打开为data并且实际上没有对它执行任何操作,我对此并不感到惊讶。

您希望从数据文件中获取单个令牌,然后在您的莫尔斯阵列中查找其索引。