morse码解码器问题

nfs0ujit  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(495)

我想写一个简单的莫尔斯电码解码器。它需要一个莫尔斯电码字符串并将其转换成英语。我正在努力解决一个问题,我的代码无法解码最后一个字符。我想我知道问题出在哪里,但我自己解决不了,所以我希望你能帮我。例如,如果我试图解码“-……--…--…--…--…--…--”也就是“开始-结束”,它把它解码成“开始-结束”。

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);

 }
}

我知道我的方法有很多问题(我确信有更好的方法来完成这个任务),但是我正在尝试自己完成这个任务,而不去看现成的例子。我希望我的代码是清楚的,以及我的解释。先谢谢你。
和平与爱!

hivapdat

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会这样工作。

相关问题