请注意,我假设您一次检索完整的莫尔斯电码消息,而不是一次检索一个字符
重点关注这一点:“如果有一个空格是字母的结尾。如果连续有2个或更多的空格是单词的结尾。”
就个人而言,我会split()
在 String 类上使用该方法。这会将一个字符串拆分为一个字符串 [],然后您可以对数组中的各个字符串进行一些检查。像这样拆分空格字符会给您带来一些行为优势:
- 任何表示字符的字符串都没有尾随或前导空格
- 任何多个空格的序列都会在返回的 String[] 中产生空字符串。
例如,在字符串 "AB C" 上调用 split(" ") 会给你一个包含 {"A", "B", "", "C"} 的 String[]
使用这个,我会首先检查空字符串是否出现。如果是这种情况,则意味着在输入的摩尔斯电码消息中至少有 2 个相邻的空格字符。然后你可以忽略第一个之后出现的任何空字符串,它将满足任意数量的连续空字符串。
不想为您完成作业,这里有一些示例代码:
public String decode(final String morseCode) {
final StringBuilder decodedMessage = new StringBuilder();
final String[] splitMorseCode = morseCode.split(" ");
for (final String morseCharacter : splitMorseCode) {
if( "".equals(morseCharacter) ) {
/* We now know we had at least 2 spaces in sequence
* So we check to see if we already added a space to spearate the
* resulting decoded words. If not, then we add one. */
if ( !decodedMessage.toString().endsWith(" ") ) {
decodedMessage.append(" ");
}
continue;
}
//Some code that decodes your morse code character.
}
return decodedMessage.toString();
}
我还写了一个快速测试。在我的示例中,我将“--”转换为“M”。在空格字符上拆分 decodedMessage 是一种计算已解码单个单词的方法。
@Test
public void thatDecoderCanDecodeMultipleWordsSeparatedByMultipleSpaces() {
final String decodedMessage = this.decoder.decode("-- -- -- -- -- -- -- -- -- -- -- -- -- --");
assertThat(decodedMessage.split(" ").length, is(7));
assertThat(decodedMessage, is("MM MM MM MM MM MM MM"));
}
当然,如果这仍然没有意义,那么阅读API总是有帮助的