我正在开发英语到莫尔斯电码的翻译器。当我用英语输入句子时,我收到的翻译是“null”,而不是相应的莫尔斯电码字符。
结果如下所示:“null|null|null|null|null”。 |
是莫尔斯字符的分隔符。我如何摆脱空值?这是我的代码:
(是的,这是作业。)
import javax.swing.JOptionPane;
public class test
{
public static void main ( String [] args )
{
String s1 = "Morse";
//Decide whether Morse code or English
String decide = JOptionPane.showInputDialog("Enter 'English' for Morse to English code translation and 'Morse' for English to Morse code translation. Pay attention to Caps.");
//Enter String
String phrasep = JOptionPane.showInputDialog("Enter the words you wish to translate.");
if ( decide.equals( s1 ))
toMorse( phrasep );
else
toEnglish( phrasep );
}
// Translate to Morse
public static void toMorse( String phrase1 )
{
char[] english = new char[36];
for ( int i = 65, j = 0; i < 91; i++, j++) {
english[j] = (char)i;
}
english[26] = 1;
english[27] = 2;
english[28] = 3;
english[29] = 4;
english[30] = 5;
english[31] = 6;
english[32] = 7;
english[33] = 8;
english[34] = 9;
english[35] = 0;
String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..", ".---",
"-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-",
"...-",".--","-..-","-.--","--.."};
//Replace spaces with |
String phrase = phrase1.replace( "//s+", "|");
String[] translation = new String[phrase1.length()];
//Translate
for ( int j = 0, t = 0, n = 1; j < phrase.length(); j++) {
if ( phrase.substring(t, n ).equals ( english[j] ) ) {
translation[t] = morse[j];
t++;
n++;
}
}
String separatorp = new String( "|" );
arrayToString ( translation, separatorp );
}
public static void toEnglish( String phrase) {
System.out.println( phrase );
}
//Convert array to string and print translation
public static void arrayToString(String[] trans, String separator)
{
String result = "";
if (trans.length > 0) {
result = trans[0]; // start with the first element
for (int i = 1; i < trans.length; i++)
result = result + separator + trans[i];
}
System.out.println ( result );
}
}
最佳答案
对于您如何编写此程序存在严重的困惑。让我们考虑一下您的核心功能:
public static String toMorse(String english) { ... }
与您的实现不同,请注意它返回一个字符串。这是因为您给它一个字符串(英语短语),而您想要返回另一个字符串(莫尔斯短语)。始终首先考虑您的数据是什么,并针对该数据编写函数。不要编写函数并考虑您的数据是什么。
现在考虑实现此功能的基本部分,您的版本在这里:
//Translate
for ( int j = 0, t = 0, n = 1; j < phrase.length(); j++) {
if ( phrase.substring(t, n ).equals ( english[j] ) ) {
translation[t] = morse[j];
t++;
n++;
}
}
首先,为什么要实例化三个变量,而您没有命名这些变量(因此第一次看到它的人不清楚它们的含义)以及同步增加的变量?下面的代码做了同样的事情:
//Translate
for ( int j = 0, t=0; j < phrase.length(); j++) {
if ( phrase.substring(t, (t+1) ).equals ( english[j] ) ) {
translation[t] = morse[j];
t++;
}
}
但从名字上看,还不清楚 j
和 t
的作用。当您进行逐个字符转换时,您实际上将它们用作索引。如果我们look at the Java String API我们看到您正在使用 substring() 来获取特定字符...除了您的起点和终点是 j
和 j+1
,这意味着您'我们总是会得到两个角色。两个字符永远不会匹配单个字符。
上面链接的文档显示了检索字符的另一个选项。
当我们这样做时,请注意:
- 如果您遵循良好的编程风格,则分隔符应存储为常量,而不是硬编码到函数中。
- 在某个地方,您使用
replace()
将特定事物的实例替换为另一个事物的实例。其次,您要详尽地遍历一个 n 长度的列表来查找特定的匹配项。使用其中一种方法。在这里同时使用两者是不合适的并且会造成困惑。 - 您的翻译时间为 O(n*m),其中 n 是短语的长度,m 是字母表中的字母数。通常这会被认为是 O(n^2),这是不好的。一个Map确实是您想要的,因为它的访问时间为 O(1),将您的函数减少为 O(n),其中 n 是短语的长度。
- 您的变量需要明确命名,以便您清楚地知道它们的作用。命名它们的行为将迫使你牢记它们的含义。
- 您应该在使用词典的功能之外设置词典。这样您就可以检查它们的正确性,而与您的翻译功能无关。
我的最后建议是远离代码并尝试用简单的英语写出执行此转换的说明。您似乎专注于细节(例如将文本粘贴到 swing 前端),这些细节阻止您解决手头的问题:如何正确地将短语从一种语言翻译成另一种语言。
关于java - 不需要的空替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12014067/