为什么我的 Java 摩尔斯电码翻译器给我错误的输出?
Why is my Java Morse Code translator giving me the wrong output?
我看到过很多关于摩尔斯电码翻译器的问题,也看过很多,但在所有这些问题中,建议的答案都给了我同样的错误输出。代码背后的想法是能够使用数组将摩尔斯电码翻译成英语,反之亦然。我的代码如下:
import java.util.Scanner;
public static void main ( String [] args )
{
String [] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "|"};
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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " "};
Scanner input = new Scanner ( System. in );
System.out.println ( "Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
int userChoice = input.nextInt();
String translateMe;
while (userChoice < 1 || userChoice > 2 ) // Ensures user enters a valid choice
{
System.out.println( "Not a valid entry. Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
userChoice = input.nextInt();
}
if (userChoice == 1 )
{
System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
translateMe = input.next();
String [] morseChar = translateMe.split(" ");
for( int x = 0; x < morseChar.length; x++)
{
String letter = morseChar[ x ];
for ( int index = 0; index < morse.length; index++ )
{
if(morse [ index ].equals(letter))
{
System.out.print(english[ index ]); // Display character at matching index position of English array to show translation
}
}
}
}
else
{
System.out.println("Please enter an English statement to translate:");
translateMe = input.next();
translateMe = translateMe.toLowerCase();
String [] englishChar = translateMe.split("(?!^)");
for ( int x = 0; x < englishChar.length; x++)
{
String letter = englishChar [ x ];
for (int index = 0; index < english.length; index++)
{
if( english [index].equals( letter ))
{
System.out.print(morse[index] + " "); // Display Morse Code array character at matching index position to show translation
}
}
}
}
}
}
我一直在使用
to be
及其对应的摩尔斯电码
- --- | -… .
作为测试短语。当我尝试用这个短语将英语翻译成摩尔斯电码时,我得到
... -.
s 和 n
作为输出。当我尝试将摩尔斯电码转为英语时,我得到
u
作为输出。我检查了我的两个字符串数组以确保 morse[A]
和 english[A]
位于相同的索引位置等等,这些都很好。我想不出还有什么会导致这个问题的。
编辑:了解我使用的是 IntelliJ IDEA 15 可能会有所帮助
我无法理解你得到的输出——虽然我没有尝试过 运行,但通过观察它我看到了一个非常不同的结果。
不过,从根本上说,您的莫尔斯到英语翻译器匹配得太早了。您需要检查整个字符串。
编辑:现在没有什么明显的问题,您是否尝试过使用调试器单步执行它以查看实际发生了什么?
n
("-."
) 的代码在您的数组中出现了两次。
- 您最好将字符串转换为
char[]
。您必须将字母表从 String[]
更改为 char[]
。
- 这就是为什么我们有
Map
。
由于您使用扫描仪,从摩尔斯语到英语的翻译无法正常工作。您需要按如下方式使用 nextLine():
if (userChoice == 1 )
{
translateMe = input.nextLine();
System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
translateMe = input.nextLine();
在那之后,即使使用拆分命令,它似乎也能正常翻译。
输出:
[.-, -..., -.-.]
abc
输出 2:
Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '
- --- | -... .
[-, ---, |, -..., .]
to be
你从英文翻译中得到 "s" 和 "n" 的原因是,如果我们检查单词 "to","t" 的字母表中的前一个字母是 "s" 而 "o" 的字母表中的前一个是 "n",所以这让我相信那里有一个循环错误。此外,您使用的是 "next()" 而不是 "nextLine()" 因此您没有解析您认为的内容。我想如果你使用 "nextLine()" 并修复你的循环,你就会拥有它。感谢您提供完整的源代码! :D
我是这样测试的:
import java.util.Scanner;
public class 主 {
public static void main ( String [] args )
{
String [] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "|"};
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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " "};
Scanner input = new Scanner ( System. in );
System.out.println ( "Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
int userChoice = input.nextInt();
String translateMe;
while (userChoice < 1 || userChoice > 2 ) // Ensures user enters a valid choice
{
System.out.println( "Not a valid entry. Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
userChoice = input.nextInt();
}
if (userChoice == 1 )
{
System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
translateMe = input.next();
String [] morseChar = translateMe.split(" ");
for( int x = 0; x < morseChar.length; x++)
{
System.out.println("Comparing " + morseChar + " to the morse array");
for ( int index = 0; index < morse.length; index++ )
{
System.out.println("Comparing equality of: " + morseChar[x] + " and " + morse[index]);
if(morseChar[x].equals(morse[index]))
{
System.out.print(english[ index ]); // Display character at matching index position of English array to show translation
}
}
}
}
else
{
System.out.println("Please enter an English statement to translate:");
translateMe = input.next();
translateMe = translateMe.toLowerCase();
System.out.println(" Translating: [" + translateMe + "]");
System.out.println("Translating: " + translateMe);
String[] englishChar = translateMe.split(" ");
for(String s : englishChar) {
System.out.println("Translation String: " + s);
}
for ( int x = 0; x < englishChar.length; x++)
{
System.out.println("Checking word: " + englishChar[x]);
for (int index = 0; index < english.length; index++)
{
System.out.println("Comparing equality of: " + englishChar[x] + " and " + english[index] + " they are " + (englishChar [ x ].equals( english[index]) ? " equal" : " not equal"));
if( englishChar [ x ].equals( english[index]))
{
System.out.print(morse[index] + " "); // Display Morse Code array character at matching index position to show translation
}
}
}
}
}
}
我看到过很多关于摩尔斯电码翻译器的问题,也看过很多,但在所有这些问题中,建议的答案都给了我同样的错误输出。代码背后的想法是能够使用数组将摩尔斯电码翻译成英语,反之亦然。我的代码如下:
import java.util.Scanner;
public static void main ( String [] args )
{
String [] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "|"};
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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " "};
Scanner input = new Scanner ( System. in );
System.out.println ( "Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
int userChoice = input.nextInt();
String translateMe;
while (userChoice < 1 || userChoice > 2 ) // Ensures user enters a valid choice
{
System.out.println( "Not a valid entry. Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
userChoice = input.nextInt();
}
if (userChoice == 1 )
{
System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
translateMe = input.next();
String [] morseChar = translateMe.split(" ");
for( int x = 0; x < morseChar.length; x++)
{
String letter = morseChar[ x ];
for ( int index = 0; index < morse.length; index++ )
{
if(morse [ index ].equals(letter))
{
System.out.print(english[ index ]); // Display character at matching index position of English array to show translation
}
}
}
}
else
{
System.out.println("Please enter an English statement to translate:");
translateMe = input.next();
translateMe = translateMe.toLowerCase();
String [] englishChar = translateMe.split("(?!^)");
for ( int x = 0; x < englishChar.length; x++)
{
String letter = englishChar [ x ];
for (int index = 0; index < english.length; index++)
{
if( english [index].equals( letter ))
{
System.out.print(morse[index] + " "); // Display Morse Code array character at matching index position to show translation
}
}
}
}
}
}
我一直在使用
to be
及其对应的摩尔斯电码
- --- | -… .
作为测试短语。当我尝试用这个短语将英语翻译成摩尔斯电码时,我得到
... -.
s 和 n
作为输出。当我尝试将摩尔斯电码转为英语时,我得到
u
作为输出。我检查了我的两个字符串数组以确保 morse[A]
和 english[A]
位于相同的索引位置等等,这些都很好。我想不出还有什么会导致这个问题的。
编辑:了解我使用的是 IntelliJ IDEA 15 可能会有所帮助
我无法理解你得到的输出——虽然我没有尝试过 运行,但通过观察它我看到了一个非常不同的结果。
不过,从根本上说,您的莫尔斯到英语翻译器匹配得太早了。您需要检查整个字符串。
编辑:现在没有什么明显的问题,您是否尝试过使用调试器单步执行它以查看实际发生了什么?
n
("-."
) 的代码在您的数组中出现了两次。- 您最好将字符串转换为
char[]
。您必须将字母表从String[]
更改为char[]
。 - 这就是为什么我们有
Map
。
由于您使用扫描仪,从摩尔斯语到英语的翻译无法正常工作。您需要按如下方式使用 nextLine():
if (userChoice == 1 )
{
translateMe = input.nextLine();
System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
translateMe = input.nextLine();
在那之后,即使使用拆分命令,它似乎也能正常翻译。
输出:
[.-, -..., -.-.]
abc
输出 2:
Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '
- --- | -... .
[-, ---, |, -..., .]
to be
你从英文翻译中得到 "s" 和 "n" 的原因是,如果我们检查单词 "to","t" 的字母表中的前一个字母是 "s" 而 "o" 的字母表中的前一个是 "n",所以这让我相信那里有一个循环错误。此外,您使用的是 "next()" 而不是 "nextLine()" 因此您没有解析您认为的内容。我想如果你使用 "nextLine()" 并修复你的循环,你就会拥有它。感谢您提供完整的源代码! :D
我是这样测试的:
import java.util.Scanner;
public class 主 {
public static void main ( String [] args )
{
String [] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "|"};
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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " "};
Scanner input = new Scanner ( System. in );
System.out.println ( "Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
int userChoice = input.nextInt();
String translateMe;
while (userChoice < 1 || userChoice > 2 ) // Ensures user enters a valid choice
{
System.out.println( "Not a valid entry. Enter 1 to translate Morse Code to English or 2 to translate English to Morse Code:");
userChoice = input.nextInt();
}
if (userChoice == 1 )
{
System.out.println("Please enter a Morse Code statement to translate. Separate letters with spaces and words with a ' | '" );
translateMe = input.next();
String [] morseChar = translateMe.split(" ");
for( int x = 0; x < morseChar.length; x++)
{
System.out.println("Comparing " + morseChar + " to the morse array");
for ( int index = 0; index < morse.length; index++ )
{
System.out.println("Comparing equality of: " + morseChar[x] + " and " + morse[index]);
if(morseChar[x].equals(morse[index]))
{
System.out.print(english[ index ]); // Display character at matching index position of English array to show translation
}
}
}
}
else
{
System.out.println("Please enter an English statement to translate:");
translateMe = input.next();
translateMe = translateMe.toLowerCase();
System.out.println(" Translating: [" + translateMe + "]");
System.out.println("Translating: " + translateMe);
String[] englishChar = translateMe.split(" ");
for(String s : englishChar) {
System.out.println("Translation String: " + s);
}
for ( int x = 0; x < englishChar.length; x++)
{
System.out.println("Checking word: " + englishChar[x]);
for (int index = 0; index < english.length; index++)
{
System.out.println("Comparing equality of: " + englishChar[x] + " and " + english[index] + " they are " + (englishChar [ x ].equals( english[index]) ? " equal" : " not equal"));
if( englishChar [ x ].equals( english[index]))
{
System.out.print(morse[index] + " "); // Display Morse Code array character at matching index position to show translation
}
}
}
}
}
}