はじめに
本記事ではTwitterで見かけた上記の問題を解くプログラムをご紹介します。
ただし、普通にJavaで解く方法については既に先駆者様がいらっしゃる(こちらの記事)ので、今回は任意の文字列を受け取るメソッドを実装し、上記の問題を解いてみました。
実装の方針
上記の問題を以下のように変換します。
文字列の配列
wordList
からランダムに要素を標準出力し続け、『その並びが文字列text
をn
回繰り返したもの』に一致したときに「lastWord
」と標準出力して終了するプログラムを作成せよ
すなわち、「ドドスコスコスコ」のような具体的な文字列ではなく、任意の文字列を受け取って動作するメソッドを実装し、そこに「ドドスコスコスコ」などのパラメータを渡すことで問題文の動作を実現します。
なお、以下のような入力は考慮しないものとします(コードが冗長になるので)。
- 0または負の繰り返し回数
-
null
、空文字、空の配列またはコレクション - 上記を要素にもつ配列またはコレクション
結論
以下のような MultipleWordPrinter
クラスを実装しました。
メインとなるのは run
メソッドで、こちらに wordList
や text
などの条件を渡すことでドドスコスコスコしてくれます。
追記
コメントでのご指摘を受けて、コードを大幅に修正しました。ありがとうございます。
主な変更点は以下の通りです。
- 目標文字列と出力文字列のデータ型を
List<String>
からString
に変更 - リスト操作メソッドの削除
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class MultipleWordPrinter {
// wordListの要素をランダムに出力し、textをtimes回繰り返した文字列が出力されたらlastWordを出力して終了する
public static void run(List<String> wordList, String text, int times, String lastWord) {
String purposeStr = IntStream.range(0, times).mapToObj(i->text).collect(Collectors.joining());
String printStr = "";
var rand = new Random();
// 初期化
while(printStr.length() < purposeStr.length()) {
String word = wordList.get(rand.nextInt(wordList.size()));
printStr += word;
System.out.print(word);
}
//はみ出た分を切り取る
if(printStr.length() > purposeStr.length()) {
printStr = printStr.substring(printStr.length() - purposeStr.length());
}
// purposeStrと一致する文字列が出力されるまで実行
while(!printStr.equals(purposeStr)) {
String word = wordList.get(rand.nextInt(wordList.size()));
printStr += word;
printStr = printStr.substring(word.length()); //はみ出た分を切り取る
System.out.print(word);
}
// 締めの言葉
System.out.println(lastWord);
}
}
スコドドスコスコスコドドドドドドドドドドドドスコスコドドドドドドドドドドドドスコドドスコドドスコスコドドドドスコスコドドスコドドドドドドドドドドドドスコドドドドドドスコスコスコスコドドドドドドドドドドドドスコスコスコスコドドドドスコスコドドスコドドスコスコドドスコスコドドドドスコドドスコスコドドドドドドドドドドドドドドドドドドドドドドスコスコドドスコスコドドスコスコドドドドドドドドドドスコスコスコドドドドドドドドドドスコドドスコスコドドスコスコドドスコドドドドスコスコドドドドドドドドスコスコドドドドスコスコドドスコドドスコスコドドスコドドドドドドスコスコドドスコドドスコドドスコドドスコドドスコスコスコスコスコドドドドスコスコドドドドスコスコドドスコスコドドドドスコドドドドスコスコスコドドドドスコスコスコドドスコスコスコスコドドドドドドスコスコスコスコドドドドドドスコドドドドスコスコスコドドドドスコドドスコドドドドスコスコスコドドスコスコドドドドスコドドドドスコドドスコドドスコスコドドスコスコスコスコドドドドスコスコスコドドスコドドスコドドドドスコドドドドスコスコスコスコスコスコドドドドスコドドドドスコスコスコスコドドスコドドスコスコスコスコスコドドスコドドスコスコドドドドドドドドドドドドドドドドスコドドドドドドドドドドスコドドスコドドドドスコドドスコドドドドスコスコスコドドスコスコスコスコドドスコドドドドドドスコスコドドスコドドドドドドスコスコスコドドスコドドスコスコスコスコドドスコドドドドスコスコドドドドドドスコスコスコドドドドスコドドドドスコドドスコスコスコスコドドドドスコドドスコドドスコスコスコスコスコドドドドドドスコドドドドドドドドスコスコスコスコドドドドスコスコドドスコスコドドスコドドスコドドドドドドドドスコスコスコドドスコドドスコドドスコスコドドスコスコスコスコドドスコドドドドドドスコドドドドドドドドスコドドスコスコドドドドスコスコスコドドドドスコドドスコスコスコスコスコドドスコドドドドスコスコドドスコスコドドスコスコスコドドスコドドスコスコドドスコドドスコスコスコドドドドスコスコドドスコドドスコスコドドスコスコドドスコドドドドスコスコドドドドドドスコドドスコドドスコドドドドドドスコスコドドスコドドドドドドスコスコドドスコスコスコスコドドドドスコスコスコドドドドドドスコドドスコドドスコドドスコドドスコスコスコドドドドドドスコスコスコスコスコスコドドドドドドスコドドスコスコスコドドドドスコスコスコドドスコスコスコスコスコスコドドドドドドスコドドスコスコドドドドドドスコドドドドスコドドドドスコドドドドスコスコスコドドドドスコスコスコスコスコドドドドドドスコドドドドドドスコドドスコスコドドドドドドスコスコドドスコスコスコドドドドドドスコドドスコスコスコドドドドドドスコドドドドスコスコドドスコスコドドスコドドドドスコスコスコドドスコスコスコドドドドドドスコスコドドドドドドスコドドスコドドスコスコスコスコドドドドドドスコドドスコスコドドスコドドスコスコスコドドドドスコスコドドドドスコドドドドスコドドスコドドスコスコドドスコスコスコドドスコドドスコドドドドスコドドドドドドスコスコドドドドドドスコスコスコドドドドドドスコドドドドドドスコドドスコドドスコドドスコドドドドドドドドスコドドスコドドスコドドスコドドドドスコドドスコドドドドスコドドスコスコスコドドスコスコスコスコスコドドスコスコドドドドスコスコドドスコスコドドスコドドスコスコドドドドドドドドスコスコドドスコスコスコスコスコドドスコドドドドドドドドスコドドスコスコドドスコドドスコスコドドドドドドドドスコドドスコスコドドスコスコドドスコドドドドスコドドドドドドスコスコドドドドドドスコドドドドドドドドドドスコドドドドドドスコドドスコスコドドドドスコドドドドスコスコスコスコスコドドスコスコドドドドスコドドドドスコドドスコスコドドドドスコドドドドドドドドスコドドスコドドスコドドスコドドスコスコスコドドスコスコスコスコスコスコドドドドスコスコスコドドスコスコドドスコドドドドドドスコドドスコスコスコドドドドスコドドスコドドスコスコスコドドスコスコスコスコスコドドスコスコドドスコスコスコスコスコスコスコドドドドスコドドドドスコスコスコスコスコスコドドスコスコスコドドドドドドスコスコドドドドドドスコドドスコドドスコドドスコドドドドスコドドドドドドスコドドスコスコスコドドドドスコドドスコドドドドドドドドドドドドスコドドスコドドドドドドドドスコスコスコスコスコドドスコスコドドスコドドスコドドスコドドスコスコスコスコスコスコスコスコスコスコドドスコドドドドドドスコドドスコスコドドドドスコスコドドスコドドスコドドドドドドスコドドドドスコドドドドスコドドドドスコスコドドドドドドドドスコスコスコスコドドドドスコスコスコスコドドドドドドドドドドドドドドドドスコスコドドドドスコスコドドスコドドスコスコドドスコドドドドスコドドドドドドドドドドスコスコスコスコスコスコドドスコスコドドスコスコスコドドスコドドスコスコドドスコドドドドスコスコドドスコスコスコスコドドドドドドドドドドスコスコドドスコスコスコドドスコスコスコスコドドドドスコドドドドドドドドスコスコドドドドスコスコドドドドスコドドスコドドドドスコスコドドドドドドドドドドスコドドドドドドドドスコスコドドスコスコスコスコドドドドドドスコスコスコドドドドドドドドスコスコドドドドドドスコスコスコドドドドスコスコドドスコドドドドドドスコスコドドドドスコドドドドドドドドスコスコスコドドドドドドスコスコスコドドドドドドスコドドスコスコスコスコスコドドドドドドドドスコドドドドドドスコスコドドドドスコスコドドドドスコスコスコドドドドドドスコドドスコスコスコドドスコドドスコスコスコスコスコドドドドスコドドドドスコスコドドドドスコドドドドスコスコスコドドスコスコドドドドドドスコドドスコドドドドスコスコドドドドスコスコドドスコドドスコスコスコスコドドドドスコスコドドスコスコスコスコスコドドスコドドスコスコドドスコドドスコドドドドドドスコスコスコスコスコドドドドスコドドドドスコドドドドドドドドスコスコドドスコスコドドドドドドドドスコドドドドスコドドドドドドスコドドドドドドドドスコドドドドスコスコスコスコスコドドスコスコドドスコドドドドスコドドスコドドドドスコドドスコドドスコスコスコスコスコスコスコスコドドドドドドスコスコドドスコスコスコドドスコドドスコドドドドドドドドドドドドスコドドドドドドドドスコドドドドスコドドドドスコスコスコドドスコスコドドドドドドドドスコスコドドスコドドドドスコスコドドスコスコドドスコスコドドドドスコドドスコスコドドドドスコスコドドスコドドドドスコドドスコドドスコドドドドドドドドスコドドスコドドドドドドスコスコドドドドドドスコドドスコドドドドスコスコスコスコスコドドドドスコスコスコドドドドドドドドドドスコスコスコドドスコドドスコスコドドドドスコスコスコドドドドドドドドスコスコスコスコドドドドドドドドスコスコドドスコスコスコスコドドドドスコドドドドスコドドドドスコドドドドドドスコドドスコドドドドスコドドドドスコスコスコスコドドドドドドドドスコドドスコスコドドドドドドドドドドスコドドドドドドスコスコドドドドドドドドスコドドスコドドドドドドスコスコドドドドスコドドドドスコスコドドスコスコドドドドドドスコスコドドドドドドドドドドスコスコドドドドドドドドスコスコドドドドスコドドドドスコスコスコドドドドドドスコスコドドスコドドドドドドドドドドドドスコドドスコスコスコドドドドスコスコスコドドスコドドドドスコドドドドスコスコスコドドスコドドスコスコスコスコドドスコドドスコドドドドドドスコドドドドドドドドドドスコスコスコドドスコドドドドスコドドドドスコドドスコスコスコドドドドスコスコスコスコドドドドドドスコスコスコドドスコドドスコスコスコスコスコドドスコドドドドドドスコドドスコドドスコドドドドドドスコスコドドドドスコドドスコドドスコスコドドスコドドドドドドドドスコドドドドスコスコドドスコドドスコドドドドドドドドスコスコスコスコドドドドスコスコスコスコドドスコスコドドスコスコスコスコドドスコドドドドスコドドスコドドドドスコスコドドドドドドドドドドドドドドドドスコドドスコドドドドスコドドスコドドスコドドスコスコドドドドスコスコドドドドスコスコドドスコドドスコスコスコスコドドドドドドドドドドドドスコスコドドスコスコスコスコスコドドドドスコスコスコスコドドドドスコドドスコドドドドドドスコスコドドドドスコスコスコスコドドスコスコドドスコドドスコドドドドドドドドドドドドスコドドスコスコドドドドドドドドドドスコドドスコドドドドスコスコドドドドスコドドドドドドスコドドドドドドスコドドスコスコドドドドスコドドドドドドドドスコドドドドドドスコスコスコスコスコドドスコスコドドドドスコドドドドドドドドドドドドスコスコドドドドスコドドドドスコドドスコスコドドドドスコドドドドスコドドスコドドスコドドドドドドドドスコドドスコドドスコドドスコドドドドドドドドドドスコドドスコドドスコスコドドドドドドドドドドドドスコスコスコスコドドドドドドドドスコドドドドスコドドスコドドドドドドドドドドドドスコドドスコスコスコスコスコドドドドスコスコドドスコスコスコスコスコドドドドドドドドドドドドドドスコスコドドドドスコスコスコドドドドドドスコドドスコスコスコドドスコドドドドドドスコドドドドドドドドスコスコドドドドスコドドドドスコドドスコスコドドドドスコスコドドスコドドスコスコドドドドスコスコドドドドドドドドスコスコスコドドドドスコスコドドスコスコスコスコスコスコドドドドドドスコスコスコドドドドスコスコスコドドスコスコスコスコスコドドドドドドドドスコドドドドドドスコドドスコドドスコドドスコドドスコスコドドスコドドドドスコドドスコスコスコスコドドドドドドスコドドドドドドドドスコスコスコスコドドドドスコドドドドドドドドドドスコスコスコスコドドスコドドドドドドスコスコスコドドドドドドドドスコスコスコドドスコスコスコスコドドスコドドスコスコドドドドドドドドスコスコスコスコドドドドスコドドドドスコドドスコスコスコスコスコスコスコドドスコスコスコドドドドドドドドドドスコスコドドスコスコスコスコドドスコスコスコドドドドドドドドスコスコドドドドドドスコスコスコドドスコスコスコドドスコドドドドドドドドドドドドドドドドドドスコドドドドスコドドスコスコスコスコスコドドドドドドドドスコドドスコスコドドスコドドスコドドドドドドスコドドスコドドスコドドスコドドドドスコドドスコドドドドスコドドスコドドドドスコスコスコドドスコドドスコスコドドドドスコドドドドスコドドドドドドドドスコドドドドスコスコスコスコスコスコドドドドスコスコドドスコスコドドスコスコドドドドスコスコスコドドスコスコドドスコドドドドドドドドドドスコスコスコドドスコドドドドドドスコドドスコドドスコドドスコドドスコスコドドドドドドスコドドスコドドドドドドスコスコスコドドドドスコスコドドスコスコドドスコスコスコドドスコドドドドドドドドドドスコスコドドドドドドスコスコスコスコドドドドドドドドドドスコスコドドドドドドスコスコドドドドドドドドスコドドドドスコスコドドスコドドスコスコドドドドスコドドスコドドドドドドドドスコドドドドスコスコスコドドスコドドドドスコスコドドドドスコスコドドスコドドスコドドドドドドドドドドスコスコドドスコスコドドドドドドスコスコスコドドスコドドドドドドドドドドスコスコドドスコドドドドドドドドドドドドスコドドスコドドドドドドドドドドスコスコドドスコドドドドスコドドスコスコスコスコスコドドスコドドスコスコスコドドドドスコドドドドドドドドスコドドスコドドドドスコドドドドドドスコスコスコドドドドスコスコドドドドスコドドドドスコスコドドドドドドドドスコスコドドスコドドドドドドスコスコスコドドスコスコドドスコスコドドスコスコドドドドスコスコスコスコスコスコドドスコスコスコドドスコスコドドドドドドドドスコドドドドドドスコスコスコスコスコスコドドドドスコスコスコスコスコスコドドスコスコドドドドドドスコスコドドドドドドスコスコスコスコスコスコドドドドドドドドスコドドドドスコドドスコスコドドスコドドスコスコドドスコスコスコスコスコスコスコスコドドスコスコスコドドドドドドドドドドスコドドドドスコドドスコスコスコスコドドスコスコスコドドドドスコドドドドドドスコスコドドドドスコドドドドスコスコドドスコドドドドスコスコスコスコスコドドスコスコスコドドドドスコドドドドスコスコスコドドスコドドドドスコスコスコスコドドドドドドドドスコドドドドスコドドドドドドスコドドスコスコスコドドドドドドスコスコスコスコスコドドドドドドスコスコスコスコドドドドスコドドスコスコスコスコスコドドスコドドスコドドドドスコドドスコスコスコドドスコドドスコスコスコドドスコスコスコスコドドスコドドドドドドスコスコドドスコドドスコスコスコスコドドスコドドスコドドドドドドスコドドドドドドスコスコスコドドドドドドドドスコスコスコスコスコドドドドドドドドドドドドドドスコスコスコスコスコスコドドスコスコスコスコスコドドスコドドドドドドスコドドドドスコスコスコスコドドドドスコドドスコスコドドスコスコスコスコドドドドドドスコドドドドドドドドドドスコドドスコドドドドスコスコドドドドドドスコドドスコスコスコスコスコスコドドドドドドスコスコドドドドスコドドドドドドスコドドスコドドスコスコスコスコスコドドドドスコスコスコドドドドスコドドドドドドドドドドドドスコドドスコスコドドドドスコドドスコスコスコスコスコスコドドドドドドスコスコスコドドドドスコスコドドドドドドドドドドスコドドドドスコドドドドスコスコスコドドスコドドドドドドスコドドスコドドスコスコスコドドドドスコスコドドドドスコスコドドスコスコスコスコドドスコドドスコスコドドスコスコドドドドドドスコスコスコドドスコスコドドスコスコスコスコドドドドドドドドスコドドドドドドドドスコスコドドドドスコドドスコスコドドスコスコドドドドドドドドスコドドドドスコドドドドスコドドスコドドドドスコドドスコドドドドドドドドドドスコスコドドドドスコスコスコスコドドスコスコスコドドスコスコスコドドスコスコドドスコスコドドスコスコスコドドスコドドスコスコドドスコスコドドスコドドドドスコスコドドスコドドドドスコドドスコドドスコドドドドドドドドドドドドスコスコドドドドスコドドスコスコスコスコドドスコドドスコスコドドスコドドスコスコスコドドドドスコドドドドドドドドドドドドドドドドスコスコスコスコスコドドドドドドスコドドドドスコドドスコドドドドスコドドドドスコスコドドドドスコスコスコスコスコスコスコスコドドスコスコスコスコドドスコドドスコドドスコドドスコドドスコスコスコスコスコドドドドドドスコドドドドスコドドスコドドドドドドドドドドドドドドスコスコドドスコドドスコドドドドドドスコドドドドドドスコスコスコスコドドスコドドスコスコドドスコスコドドスコドドスコスコドドドドドドドドドドドドドドスコドドドドスコドドスコドドドドスコスコスコドドドドスコスコドドスコスコドドスコスコドドスコドドスコスコスコドドスコドドドドスコドドドドスコスコドドドドスコスコスコドドスコドドドドドドスコスコスコスコスコスコスコドドドドドドドドドドドドスコドドドドスコドドドドスコスコドドドドスコスコドドスコドドドドドドスコスコスコドドドドスコスコスコスコスコスコスコドドスコドドドドドドスコスコスコドドスコドドスコドドドドドドドドドドスコドドドドスコスコドドドドドドドドドドスコスコドドドドスコスコスコドドドドドドドドスコドドスコドドスコスコドドスコスコスコスコスコドドスコドドドドスコドドスコスコスコスコドドスコドドドドスコスコスコドドドドスコドドドドスコドドスコドドドドスコスコスコドドスコスコドドドドドドスコドドドドスコスコドドドドドドドドスコドドドドスコスコドドドドドドドドスコドドスコスコスコスコスコドドドドスコドドスコスコスコドドドドドドドドスコスコスコドドスコスコスコドドスコドドスコドドスコドドドドドドスコスコスコドドスコドドドドドドスコスコスコドドスコスコスコスコドドスコスコドドスコドドドドスコドドスコスコドドドドスコドドスコドドスコドドドドドドスコスコスコスコドドドドドドドドドドスコスコドドスコスコドドドドスコスコドドドドスコドドスコドドドドドドドドドドスコドドドドスコスコスコスコドドドドドドスコスコスコドドスコスコスコドドスコドドドドドドドドスコドドスコスコドドスコスコスコスコドドスコドドスコスコドドドドドドドドドドスコスコスコドドドドスコスコドドスコドドドドスコドドドドスコドドスコスコスコスコスコドドスコドドスコスコスコスコドドスコスコドドスコスコドドスコスコスコスコドドドドスコスコドドドドスコドドドドスコスコスコスコドドスコスコスコドドスコドドドドスコドドスコスコドドドドスコドドドドスコスコドドドドドドドドドドドドドドスコドドスコドドドドドドスコスコスコスコスコスコスコスコドドドドスコスコドドスコドドドドスコドドドドスコドドドドドドスコスコドドスコスコドドスコドドスコドドドドスコドドスコドドドドスコスコドドドドドドスコドドスコドドドドスコドドスコスコスコスコスコスコスコドドドドスコドドドドスコスコスコドドスコスコドドドドドドドドドドドドスコスコスコドドドドスコスコドドスコスコドドスコドドスコスコスコドドスコスコスコスコドドスコドドドドスコスコドドドドスコスコスコドドドドスコドドスコスコスコスコスコドドスコドドスコスコスコドドスコスコドドドドドドドドスコドドスコドドドドスコスコドドスコスコドドスコスコドドドドスコドドスコスコドドドドドドドドドドドドドドドドドドドドドドスコスコスコスコドドドドスコスコドドスコドドスコスコドドドドドドスコスコスコスコスコドドスコドドドドスコスコスコスコスコドドスコドドスコスコスコスコスコドドスコドドスコスコドドドドドドドドドドドドスコスコドドスコスコドドスコドドスコドドドドスコスコドドドドドドスコスコドドスコスコドドドドスコスコスコスコドドスコドドスコスコスコドドドドスコスコスコドドスコスコスコドドドドドドドドスコスコスコスコスコスコドドスコスコドドスコドドドドスコスコドドスコドドスコスコスコドドドドドドスコスコスコスコドドドドスコスコスコスコドドドドスコドドドドスコスコドドスコドドドドスコドドスコドドスコスコスコスコスコスコスコスコドドスコスコスコドドドドスコドドドドスコドドドドドドスコスコドドドドドドドドドドドドスコドドドドドドスコスコスコスコドドドドドドドドスコドドスコドドドドスコドドスコドドスコドドドドスコドドドドドドドドドドドドドドドドドドドドドドスコスコスコドドドドスコスコスコスコドドスコスコスコスコスコスコスコスコドドドドドドスコドドドドドドスコスコドドドドスコドドドドドドドドスコドドドドスコスコスコドドドドドドドドドドスコスコドドドドスコスコスコドドドドスコドドスコドドドドスコドドスコドドドドスコドドドドスコドドドドスコドドドドドドドドスコスコドドドドドドドドドドスコスコドドドドスコドドドドスコスコドドドドドドドドスコドドドドスコスコドドスコドドスコドドスコドドスコスコドドスコスコドドドドドドドドドドドドスコスコドドドドドドドドドドスコドドドドスコスコスコスコドドドドスコドドドドスコスコドドドドスコドドドドドドスコスコスコスコドドドドスコドドドドスコスコドドスコドドドドドドドドスコスコドドドドドドドドスコスコスコスコドドスコスコドドドドドドドドドドドドスコスコドドドドスコドドドドスコドドスコドドドドスコスコドドスコスコドドドドドドスコスコドドスコドドスコドドスコドドスコスコドドドドスコスコドドスコスコスコドドスコスコスコスコスコドドドドドドスコスコドドドドスコドドドドスコスコスコドドスコドドドドスコドドスコドドドドスコドドドドスコスコドドドドドドドドスコスコドドスコドドドドスコドドドドスコスコドドドドスコスコドドスコスコドドスコスコスコドドドドスコスコドドスコドドスコスコドドスコドドドドドドドドドドスコスコドドスコドドスコドドドドスコドドドドスコスコドドスコドドドドドドドドスコスコドドドドスコスコスコスコドドドドスコドドドドスコスコドドドドドドスコスコドドスコドドドドスコドドスコドドスコドドスコドドスコドドスコドドスコスコドドドドドドドドドドスコスコドドドドドドドドスコドドドドドドドドドドスコスコドドドドドドドドスコドドスコドドスコスコドドドドドドドドスコスコドドドドスコスコスコスコスコドドスコドドドドドドスコドドスコドドドドスコドドスコスコスコスコスコスコスコドドドドスコドドドドドドスコスコドドスコドドドドドドスコスコドドドドドドドドスコスコドドドドドドスコドドドドドドスコドドドドドドスコスコスコスコスコスコドドドドスコスコドドドドドドスコドドドドスコスコスコドドスコスコスコスコスコドドスコドドドドドドドドドドスコドドスコスコスコドドドドドドドドドドスコドドドドドドスコスコドドドドスコドドドドドドスコスコスコドドドドスコドドドドスコドドドドドドドドドドドドスコドドドドスコドドドドスコドドドドドドドドドドスコドドドドドドドドスコスコドドスコドドドドスコドドスコドドドドドドドドスコドドドドドドスコスコドドドドドドスコスコドドスコドドスコスコドドドドドドスコドドドドスコドドドドドドスコドドスコドドドドドドスコドドドドドドドドドドドドドドドドスコスコスコスコスコスコスコスコドドスコスコドドドドドドドドスコスコスコドドスコドドスコスコドドドドスコスコドドドドスコスコスコスコスコスコスコスコドドスコスコスコドドスコスコドドドドスコドドスコスコドドドドドドドドドドスコドドドドスコスコドドドドスコスコドドドドスコスコドドスコドドスコスコドドスコスコスコスコドドドドスコスコスコドドドドスコスコドドスコドドドドドドスコドドドドスコドドドドドドスコスコドドスコドドドドドドドドスコドドドドスコドドスコドドスコスコドドドドドドスコドドドドドドスコドドドドドドスコスコドドドドドドドドスコスコドドスコスコスコスコドドスコドドドドスコドドスコドドスコスコドドスコスコドドドドドドドドスコドドドドスコドドドドスコスコドドスコスコスコスコスコスコスコスコスコスコドドドドスコドドスコドドドドドドドドドドスコスコスコドドドドドドドドスコスコドドドドドドスコドドドドスコスコドドドドスコドドドドスコドドドドスコスコドドドドドドドドスコスコスコスコスコスコドドスコドドドドドドスコドドスコスコドドドドドドドドドドドドスコスコスコドドドドスコスコスコドドドドスコスコドドドドドドドドスコスコドドスコスコスコスコスコドドドドスコドドスコドドスコスコスコスコスコドドスコスコスコスコドドスコスコスコスコドドスコスコスコスコスコドドドドドドドドスコスコスコスコドドドドドドスコドドスコドドスコドドスコドドドドドドドドスコドドスコドドドドドドスコスコドドスコスコスコスコスコスコドドドドドドドドスコスコスコスコドドスコスコドドスコスコドドドドドドスコドドドドドドドドドドドドドドスコスコドドドドスコドドドドスコスコドドスコスコスコスコスコスコドドスコスコドドドドスコドドスコドドスコドドスコドドドドスコドドドドドドスコスコスコドドドドスコスコスコスコドドドドスコスコドドスコスコスコドドスコスコスコドドスコスコスコラブ注入♡
解説
run
メソッドは以下の順番で処理を行います。
-
text
をtimes
個並べて結合し、purposeStr
を生成する -
wordList
からランダムに出力した文字列を記憶するprintStr
を用意する -
printStr
の長さがpurposedStr
と同じになるまでランダムにワードを出力する(初期化) - ランダムに出力したワードを
printStr
の末尾に追加し、先頭の要素を削除する。これをprintStr
とpurposedStr
が一致するまで繰り返す -
lastWord
を出力して終了する
手順1. では IntStream
を利用して times
個の text
を作成し、それを Collectors.joining()
で結合します。
for
文でも書けますが、3行くらい必要になるのでこちらの書き方にしました。
また、手順4. のアルゴリズムについては、冒頭で紹介した先駆者様のコードを参考にさせて頂きました。
「長さ固定ならリングバッファみたいに実装した方が良いのでは?」とか色々考えてみたのですが、標準出力が重すぎてほとんど誤差だったので、結局素直な実装に落ち着きました。
本実装のメリット
今回実装したメソッドはパラメータ(引数)で実行条件を受け取ります。
なので、以下のように問題文と異なった入力を与えても正常に動作します。
import java.util.List;
public class Test {
public static void main(String[] args) {
MultipleWordPrinter.run(List.of("オ", "レ", "ー", "オレ"), "オーレオレ", 1, "マツケンサンバ");
}
}
ーレオレオレオレオレレオオレオオレレレオレーオオレオーレオオオレーレレレオレオレーレオレオレオオレーレオレオレーレーオレオーーーーーオーオーーオレオレオレーーーオレオオレレレオレオオレオレオオレオオレオレーオオレーオレオレレオーーーオオレレオオレオレオレオレレオレーレオーオレーーーオーーーオオオーオオオオオーーオーオレオオーーオーオレーーレーオレーーーーオレオオーオーレオーオレオレオレオレーオオレオレレオレレレーーレオレオレオレオレオレオレーオレーオオオレーオレオオレーーオレオレレレレーーオレーオレレーオレーオレオレレーオオーオレオーーオレレーオレーレーレレーオレオレレオレーオオレオレオレーーーオレレオレオレオレレレレレオオレレオレーオレオレオレオオレオオオレオレオレオオレオオレオレオレレオレオレオーオレオレーオーオレレオレレーレオレオオオオレオレーーレオーオレレオレレレオレーーーオレレオレオレオレレーオオオレーレレレオレーーーオレレーレオオレーレレオーオレレオレオオオーーーレオーーレレーオーオレレオレレオレオレーーーーレレーオレーオオレオレレーオーレレオレオレオレオーーレーオレレオレレオレレレーーーオオレーオレレーーオレーーーオレーオーオレオーオレレオレーーーオレオレレーーオレオレーオオオオレレーオレオーーーーレーオレオレオレオレーオレオオレオレーオレーオオレオレオレーーオレーオオレーレオオレオレーーオレオオオーオーオレオレレオーオレオレーオオレオレオオオオレオレーレーオレーオレレーレオレオレオーーレレレオレーレーオーオオレレオレレオレオレオレオレーオレーオレオオレオオレオオレオレレオレオレーレオオレレオオレオオレオオレーレオレレオレオオオレレオレーーーオレオレオオオレーーオレオオオレレオレーーオオーオオレオレオレオレオオレレーレーオレレオオレオーオレオレオレレオレオオレレオレレオレレオオレーオオレオレーオレオレレオーオレーレオーーオレーオレオレレーオレーレレオオーレオレマツケンサンバ
問題そのものを解く上では余分な機能ですが、実際の開発等を想定するならばこのような実装もありなのかなと思います。
特定のパラメータに依存しない実装は、修正や機能追加に強いというメリットがあります。
少ないコードで様々なデータ・シチュエーションに対応できる ...... そんな一種のエレガントさを秘めているのが、抽象的なプログラミングの魅力です。
今回の実装はそこまで抽象的でもないですが、インターフェースとかジェネリクスとか、突き詰めると奥が深い(そして便利な)ので、気になった方はぜひぜひ調べてみてください。