【问题标题】:Morse Code decoder problem with looping through String循环字符串的摩尔斯电码解码器问题
【发布时间】:2020-08-23 10:47:44
【问题描述】:

我正在尝试编写一个简单的摩尔斯电码解码器。它需要一个摩尔斯电码字符串并将其转换为英语。我正在努力解决一个问题,我的代码没有解码最后一个字符。我想我知道问题出在哪里,但我无法自己解决,所以希望你能帮助我。 例如,如果我正在尝试解码“-... . --. .. -. - .... . -. -..” 这是“Begin The End”,它会将其解码为“Begin the En ”。

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

 }
}
    
  

我知道我的方法会出现很多问题(我确信有更好的方法来完成这项任务),但我正在尝试自己完成这项任务,而不查看现成的示例。我希望我的代码和我的解释一样清楚。提前谢谢你。

和平与爱!

【问题讨论】:

    标签: java string loops if-statement hashmap


    【解决方案1】:

    java 是 0 索引的。你有点知道这一点;你的 for 循环从 0 到 i &lt; codeToDecode.length()

    所以:for (int i = 0; i &lt; 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 就可以了。
    • 用单独的方法填充字典,这样更简洁。
    • 如果不需要,请不要包含明确的角标(例如:如果输入大小低于 3),并且这里不应该需要它。修复错误后,您的主循环将完成工作。
    • 请注意,SOS 的实际摩尔斯电码是无限重复 SOSOSOSOSO.... 的任何子序列,其中至少包含 ...---...。例如,.---...---...---...--- 也是一个 SOS。如果你想重复呼救,你不要做 6 个点,只要永远重复 3 个破折号和 3 个点。这个想法也是一个潜在的救援者最终会进入范围并开始在你无尽的序列中的某个未知点接收信号。有了这种心态,SOS 为何如此运作应该是显而易见的。

    【讨论】:

    • 非常感谢您的回答,尤其是代码风格提示(对于Java和编程的新手来说,这对我来说非常重要)。我用(if (i == codeToDecode.length() - 1)) 错过了那部分,所以现在在我修复它之后它更有意义。但我也必须这样做: i f(i==codeToDecode.length()-1){ decode+=vocabulary.get(codeToDecode.substring(flag,i+1));否则,它会在最后一个空格后占用 2 个字符,但会忽略最后一个字符。
    猜你喜欢
    • 2020-02-05
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多