2009-12-06 19 views
6

Sto provando a convertire il codice Morse in testo.Java: Convertitore MorseCode

Ho due file di testo da utilizzare con questo problema. morseCode.txt: Ho un file che ho letto che contiene le lettere e il corrispondente codice Morse equivalente.

morse.dat: suo il file che contiene il messaggio cifrato in codice Morse

ero in grado di leggere il primo file in modo corretto e quindi memorizzare poi in array separati. L'ho provato stampando la matrice per lettere e codice morse array e ho scoperto che lo memorizzava correttamente e in ordine.

Ho problemi con la lettura del messaggio del secondo file. Questa è la chiave 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 ----. 
. .-.-.- 
, --..-- 
? ..--.. 

Questo è ciò che il file Message.txt assomiglia:

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

relativo presunto ouput:

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

+++ QUESTA È LA MIA SOLUZIONE +++

/*  
*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(); 
    } 
} 
+0

Hi Mark, Non sono riuscito a seguire la soluzione, ma ho trovato una soluzione. Non entriamo nella programmazione orientata agli oggetti nel mio corso dal momento che è una classe principiante. Puoi mostrarmi la soluzione completa al problema usando il tuo Lettore Buffered. Ho pubblicato la mia soluzione in cima. Grazie. – HelloWorld

+0

Non ci è stato insegnato come usare i metodi BTW. Alcune persone si sono chieste perché il mio codice è così. – HelloWorld

risposta

3

Si avrà un problema utilizzando Scanner per analizzare il file morse.dat perché esistono due tipi di delimitatore: uno spazio e una nuova riga. Il modo più semplice è probabilmente quello di leggere una riga alla volta usando un BufferedReader e dividere la linea su uno spazio. Ecco il codice per farlo. Ho evitato di usare metodi perché non li hai ancora appresi.

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(' '); 
      } 
     } 
    } 
} 

uscita del programma di cui sopra:

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

Spero che ti aiuta!

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

Considerando che si apre il file come data e in realtà non fare nulla con esso, non sono sorpreso che non funziona.

Si desidera ottenere i singoli token dal file di dati e quindi cercare il loro indice nell'array morse.