注: 一度に 1 文字ずつではなく、完全なモールス符号メッセージを一度に取得していると仮定しています。
この点に着目すると、「文字の末尾にスペースが 1 つある場合。単語の末尾にスペースが 2 つ以上連続している場合」です。
個人的にはsplit()
、String クラスのメソッドを使用します。これにより、文字列が 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」に変換しました。デコードされたメッセージをスペース文字で分割することは、デコードされた個々の単語をカウントする方法でした。
@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を読むことが常に役に立ちます。