Java 不需要的空替换
我正在做一个英语到摩尔斯语的翻译。当我用英语输入我的句子时,我收到的是一个用“空”而不是相应的莫尔斯字符填充的译文 结果是这样的:“null | null | null | null | null”Java 不需要的空替换,java,Java,我正在做一个英语到摩尔斯语的翻译。当我用英语输入我的句子时,我收到的是一个用“空”而不是相应的莫尔斯字符填充的译文 结果是这样的:“null | null | null | null | null”|是莫尔斯字符的分隔符。我如何消除空值?这是我的密码: (是的,这是家庭作业。) import javax.swing.JOptionPane; 公开课考试 { 公共静态void main(字符串[]args) { 字符串s1=“莫尔斯”; //决定是摩尔斯电码还是英语 String decise=J
|
是莫尔斯字符的分隔符。我如何消除空值?这是我的密码:
(是的,这是家庭作业。)
import javax.swing.JOptionPane;
公开课考试
{
公共静态void main(字符串[]args)
{
字符串s1=“莫尔斯”;
//决定是摩尔斯电码还是英语
String decise=JOptionPane.showInputDialog(“输入'English'表示摩尔斯电码到英语的翻译,输入'Morse'表示英语到摩尔斯电码的翻译,注意大写)。”;
//输入字符串
String phrasep=JOptionPane.showInputDialog(“输入要翻译的单词”);
如果(决定等于(s1))
toMorse(phrasep);
其他的
英语(短语);
}
//翻译成莫尔斯
公共静态void-toMorse(字符串短语1)
{
字符[]英语=新字符[36];
对于(inti=65,j=0;i<91;i++,j++){
英语[j]=(char)i;
}
英语[26]=1;
英语[27]=2;
英语[28]=3;
英语[29]=4;
英语[30]=5;
英语[31]=6;
英语[32]=7;
英语[33]=8;
英语[34]=9;
英语[35]=0;
字符串[]morse={“-”,“-…”,“-.-”,“-…,”,“-”,“-”,“-”,“-”,“-”,“-”,“-”,
"-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-",
"...-",".--","-..-","-.--","--.."};
//将空格替换为|
字符串短语=短语1.替换(“//s+”,“|”);
String[]translation=新字符串[phrase1.length()];
//翻译
对于(int j=0,t=0,n=1;j0){
result=trans[0];//从第一个元素开始
对于(int i=1;i
添加一些“System.out.println”将帮助您了解代码中的错误。请关注:
for ( int j = 0, t = 0, n = 1; j < phrase.length(); j++)
{
if ( phrase.substring(t, n ).equals ( english[j] ) )
{
translation[t] = morse[j];
// Try add one line:
System.out.println(translation[t];
t++;
n++;
}
}
for(int j=0,t=0,n=1;j
顺便问一下,你使用Eclipse或NETBeas等吗?如果不是,你可能会学习其中一个。
你写这个程序有很大的困惑。让我们来看看你的核心功能,并考虑它:
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++;
}
}
//翻译
对于(int j=0,t=0,n=1;j
首先,你为什么要实例化三个变量,你没有命名它们(因此第一次看它们的人不清楚它们的意思),并且你在lockstep中增加了它们?下面做同样的事情:
//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++;
}
}
//翻译
for(int j=0,t=0;j
但是从名字上看,j
和t
做了什么还不清楚。你真的在用它们作为索引,就像你在逐字符转换一样。如果我们看到你在用substring()获取特定字符…除了起点和终点是j
和j+1
,这意味着您将始终获得两个字符。两个字符永远不会匹配单个字符
上面链接的文档显示了检索字符的另一个选项
当我们进行此操作时,请注意:
- 如果您遵循良好的编程风格,那么分隔符应该作为常量存储,而不是硬编码到函数中
- 在一个位置,您使用
将特定事物的实例替换为另一个实例。在另一个位置,您正在遍历一个n长度的列表,以查找特定的匹配项。使用一种或另一种方法。在这里使用这两种方法是不合适的,而且会造成混乱replace()
- 你的翻译时间是O(n*m),其中n是短语的长度,m是字母表中的字母数。通常这被认为是O(n^2),这是不好的。A是你真正想要的,因为它是O(1)访问时间,将你的函数减少到O(n),其中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++;
}
}