The value for the Morse Code translation keeps returning null
and I've done everything I can think of to fix it. We are restricted to using arrays on this assignment. What can I do to correct it?
import j开发者_JAVA百科avax.swing.JOptionPane;
import java.util.*;
import java.io.*;
public class morseCodeTest
{
public static void main(String[] args)throws IOException
{
String userInput;
final String SENTINEL = "0";//for exiting program when entered
//object creation
Translate text = new Translate();
//getting user input to be translated
do
{
userInput = JOptionPane.showInputDialog("Please enter what you wish to translte to Morse code (no punctuation).");
String compare = userInput.toUpperCase();
String[] codedText = new String[compare.length()];
codedText = text.translateHere(compare);
text.toString(userInput, codedText);
}while(!userInput.equals(SENTINEL));
}//end main
}//end class
class Translate
{
public Translate()
{
}//end default constructor
public String[] translateHere(String s)throws IOException
{
String compare = s, codedLine = ""; //userInput toUpperCase
int length = compare.length(); //length of userInput
String line, file = "Morse.txt";// variable holding file name and variable for each letter/number
char code;
//Constants
final int MAX = 36;
//Arrays
char[] morseLetter = new char[MAX];
String[] morseCode = new String[MAX];
String[] newMessage = new String[length];
//putting user input in a character array;
char[] userLetters = compare.toCharArray();
//object creation
File openFile = new File(file);
Scanner inFile = new Scanner(openFile);
//for loop that will read data from the Morse.txt file
for(int i = 0; i < MAX; i++)
{
while(inFile.hasNext())
{
line = inFile.next();
code = (char)line.charAt(0);
morseLetter[i] = code;
morseCode[i] = inFile.next();
}//end nested while loop
}//end for loop
for(int j = 0; j < length; j++)
{
for(int k = 0; k < MAX; k++)
{
if(userLetters[j] == morseLetter[k])
{
newMessage[j] = morseCode[k];
}
}//end nested for loop
}//end for loop
return newMessage;
}//end method that completes translateion
public String toString(String a, String[] b)
{
String input = a;
String[] coded = b;
String[] encoded = new String[input.length()];
//JOptionPane.showMessageDialog(null, "Original Text: " + input + "\nCoded Text: " + coded);
for(int l = 0; l <input.length(); l++)
{
encoded[l] = coded[l];
}
String str = "";
System.out.print(Arrays.toString(encoded));
return str;
}//end toString method
}//end Translate Class
The Morse code text file contains the following:
1 .---- 2 ..--- 3 ...-- 4 ....- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 ----- 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 --..
Your Translate.toString
method will always return an empty string because that's the only thing you assign to the str
variable.
public String toString(String a, String[] b)
{
System.out.println("Input: " + a);
System.out.println("Output:");
String output = "";
for(int i = 0; i < b.length; i++)
{
output = output + b[i];
}
return output;
}//end toString method
But the real problem is this loop:
for(int i = 0; i < MAX; i++)
{
while(inFile.hasNext())
{
line = inFile.next();
code = (char)line.charAt(0);
//System.out.println(code);
morseLetter[i] = code;
morseCode[i] = inFile.next();
}//end nested while loop
}//end for loop
There you try parsing the morse code letters into a file, but the problem is the for loop is in the first iteration and then, the whole while loop is executed, therefore you're always placing the morsecode in the first position of the array.
So it should look like that:
int counter = 0;
while(inFile.hasNext())
{
line = inFile.next();
code = (char)line.charAt(0);
//System.out.println(code);
morseLetter[counter] = code;
morseCode[counter] = inFile.next();
counter++;
}//end nested while loop
As an additional note: Did you noticed that if the user clicks cancel in your OptionsDialog that there is a NullPointer? Proper exception handling is part of the assignment I think ;)
Therefore I would write the loop like this:
do
{
userInput = JOptionPane.showInputDialog("Please enter what you wish to translte to Morse code (no punctuation).");
if (userInput != null && !userInput.equals("")) {
String compare = userInput.toUpperCase();
String[] codedText = new String[compare.length()];
codedText = text.translateHere(compare);
text.toString(userInput, codedText);
}
}while(userInput != null && !userInput.equals(SENTINEL));
精彩评论