有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将摩尔斯电码读取器中的空字符串转换为空白

我想写一个莫尔斯电码翻译来迎接挑战。目前,我已经将莫尔斯电码转换成一个字符串数组,并通过一个for循环来构建消息

我现在得到了HEYnullnullJUDE,正在研究如何检测莫尔斯电码中充当单词空间的两个空格。但是,当我使用if语句检测.isEmpty.isBlank.length() == 0时,for循环退出,并返回:

9
this is split  = [...., ., -.--, , , .---, ..-, -.., .]
H
H
E
HE
Y
HEY

出于某种原因,一旦它点击Null,它就退出并返回HEY,而不是执行nullCount,我不确定

把我现在得到的{}转换成{}并检测莫尔斯电码中的双空格的最佳方法是什么

这是来自这个codewars挑战:https://www.codewars.com/kata/54b724efac3d5402db00065e/train/java

import java.util.Arrays;
public class MorseCodeDecoder {
    public static String decode(String morseCode) {
        
       String[] split = morseCode.trim().split(" ");
        int length = split.length;
        System.out.println(length);
        System.out.println("this is split  = " + Arrays.toString(split));

        MorseCode morseCoder = new MorseCode();
        
        String message = "";

        for (int i =0; i < length; i++){
          int nullCount = 0;
            

// this is where the code exits for some reason

            if(morseCoder.get(split[i]) == null{
              nullCount++;
              System.out.println(nullCount);
              if (nullCount == 2){
                nullCount =0;
                message = message + " ";
              }
            }
// if this is "if"statment is removed i get HEYnullnullJUDE

          System.out.println (morseCoder.get(split[i]));
        message = message + morseCoder.get(split[i]);
            System.out.println(message);
              
        }
      return message;
      
    }
}

samble test
import org.junit.Test;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;

public class MorseCodeDecoderTest {
    @Test
    public void testExampleFromDescription() {
      assertThat(MorseCodeDecoder.decode(".... . -.--   .--- ..- -.. ."), is("HEY JUDE"));
    }
}

共 (1) 个答案

  1. # 1 楼答案

    你的输入是".... . -. . - ..- -.. ."

    由于调用trim(),因此split()将不会看到前导空格或尾随空格

    要在split()的结果中将3个空间视为单个空间,基本上不希望在3个空间的中间分割。换句话说,你只想在一个非空间后面的空间上分割,或者在一个非空间后面的空间上分割

            Split on these
        ↓ ↓    ↓ ↓    ↓   ↓   ↓
    .... . -.    . - ..- -.. .
                ↑
          Don't split on this
    

    如果使用split("(?<=[^ ]) | (?=[^ ])"),则结果为:

    { "....", ".", "-. ", " ", ". -", "..-", "-..", "." }
    

    在这里,摩尔斯电码中的空格真的变成了一个只有一个空格的字符串

    我将把剩下的留给您,例如,如何使morseCoder.get(" ")返回" "(或' ',无论类型如何)


    更新

    评论如下:

    MorseCode.get does not include " " space detection

    morseCoder.get(" ")返回" "只是一个如何解决它的例子。或者,只需在调用morseCoder.get(...)之前检查是否遇到空格,例如

    StringBuilder buf = new StringBuider();
    for (String symbol : split) {
        if (symbol.equals(" ")) {
            buf.append(' ');
        } else {
            String str = morseCoder.get(split[i]);
            buf.append(str == null ? "�" : str);
        }
    }
    String message = buf.toString();