我想写一个简单的莫尔斯电码解码器。它需要一个莫尔斯电码字符串并将其转换成英语。我正在努力解决一个问题,我的代码无法解码最后一个字符。我想我知道问题出在哪里,但我自己解决不了,所以我希望你能帮我。例如,如果我试图解码“-……--…--…--…--…--…--”也就是“开始-结束”,它把它解码成“开始-结束”。
public class Main {
public static void main(String[] args) {
String codeToDecode = "-... . --. .. -. - .... . . -. -.."; // any random Morse code
String decode = "";
int flag = 0;
codeToDecode=codeToDecode.replace(' ','/');
Map<String, String> vocabulary = new HashMap<>(); //This is my "vocabulary"
vocabulary.put(".-", "a");
// it goes on this way, i'll cut next letters to save space.
...
vocabulary.put("--..", "z");
if(codeToDecode.length()<3){
decode += vocabulary.get(codeToDecode);
}
if(codeToDecode=="...---..."){
decode="SOS";
}
for (int i = 0; i <codeToDecode.length(); i++) {
if (codeToDecode.charAt(i) == '/') { // Here must be the problem. '/' is the blank space. My code "decodes" parts from space to space, but in the end of the string there is no blank space so it ignores last letter. I tried using "||i==codeToDecode.length()" in if statement, but it didn't work.
decode += vocabulary.get(codeToDecode.substring(flag, i));
flag = i + 1;
} if(codeToDecode.charAt(i)=='/'&&codeToDecode.charAt(i+1)=='/'){
decode+=" ";
i+=2;
flag+=2;
}
}
decode=decode.toUpperCase();
System.out.println(decode);
}
}
我知道我的方法有很多问题(我确信有更好的方法来完成这个任务),但是我正在尝试自己完成这个任务,而不去看现成的例子。我希望我的代码是清楚的,以及我的解释。先谢谢你。
和平与爱!
1条答案
按热度按时间hivapdat1#
java是0索引的。你大概知道这一点;for循环从0到
i < codeToDecode.length()
.因此:
for (int i = 0; i < 10; i++)
将打印。。0到9。它从不打印10。这就是它工作的原因:如果您写入以下内容,长度为10的字符串将放弃其最后一个字符:str.charAt(9)
.charAt(9)
得到第10个字符(因为.charAt(0)
给你第一个)。所以,如果你写:
if (i == codeToDecode.length())
,那是永远不会发生的。在最后一个char位置,i是9,codetodecode.length()是10。尝试if (i == codeToDecode.length() - 1)
.注意:一些代码样式提示:
codeToDecode
相当笨拙。也许只是code
很好。用另一种方法把那本词典填好,这样就更干净了。
如果不需要,不要包含显式的cornercase(例如:如果输入大小小于3),这里也不需要。一旦修复了错误,主循环将完成任务。
注意,sos的实际莫尔斯电码是无休止重复的SOSO的任何子序列。。。。至少包含
...---...
. 例如,.---...---...---...---
也是sos。如果你想反复呼救,你不需要做6个点,只要不断重复3个破折号和3个点。这个想法也是一个潜在的营救者最终会进入你的射程,开始在你无尽的序列中的某个未知点接收信号。有了这种心态,就应该明白为什么sos会这样工作。