Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不需要的空替换_Java - Fatal编程技术网

Java 不需要的空替换

Java 不需要的空替换,java,Java,我正在做一个英语到摩尔斯语的翻译。当我用英语输入我的句子时,我收到的是一个用“空”而不是相应的莫尔斯字符填充的译文 结果是这样的:“null | null | null | null | null”|是莫尔斯字符的分隔符。我如何消除空值?这是我的密码: (是的,这是家庭作业。) import javax.swing.JOptionPane; 公开课考试 { 公共静态void main(字符串[]args) { 字符串s1=“莫尔斯”; //决定是摩尔斯电码还是英语 String decise=J

我正在做一个英语到摩尔斯语的翻译。当我用英语输入我的句子时,我收到的是一个用“空”而不是相应的莫尔斯字符填充的译文

结果是这样的:“null | null | null | null | null”
|
是莫尔斯字符的分隔符。我如何消除空值?这是我的密码:

(是的,这是家庭作业。)

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
,这意味着您将始终获得两个字符。两个字符永远不会匹配单个字符

上面链接的文档显示了检索字符的另一个选项

当我们进行此操作时,请注意:

  • 如果您遵循良好的编程风格,那么分隔符应该作为常量存储,而不是硬编码到函数中
  • 在一个位置,您使用
    replace()
    将特定事物的实例替换为另一个实例。在另一个位置,您正在遍历一个n长度的列表,以查找特定的匹配项。使用一种或另一种方法。在这里使用这两种方法是不合适的,而且会造成混乱
  • 你的翻译时间是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++;
    }
}