まず第一に、再帰を使用してこの問題を解決する必要がある理由を尋ねる必要があります。Introduction to Computer Science - Javaページでは、再帰的なソリューションを説明するいくつかの特徴を見つけることができます:
- 解決策と戻り値がある単純な基本ケース。
- 問題をベースケースに近づける方法。つまり、問題の一部を切り取って、やや単純な問題にする方法です。
- 単純な問題をメソッドに戻す再帰呼び出し。
私にとって、あなたの問題はこの特性とはまったく一致しません。
しかし、OK、あなたはこの方法でそれをしたくありません - あなたはしなければなりません.
まず、問題を表すことができるモデルについて考える必要があります。Line
行番号と行を格納する単純なクラスを作成しました。
class Line {
private int number;
private String text;
public Line(int number, String text) {
this.number = number;
this.text = text;
}
public int getNumber() {
return number;
}
public String getText() {
return text;
}
@Override
public String toString() {
return number + " : " + text;
}
}
次に、単純なループを使用するソリューションを作成する必要があります。
class LoopSearcher {
public List<Line> findLines(String text, List<String> lines) {
List<Line> matchLines = new ArrayList<Line>();
int index = 0;
for (String line : lines) {
index++;
if (line.contains(text)) {
matchLines.add(new Line(index, line));
}
}
return matchLines;
}
}
次の方法でテストできます。
List<String> lines = IOUtils.readLines(new FileInputStream(new File(
"D:/test.txt")));
List<Line> loopLines = new LoopSearcher().findLines("test", lines);
for (Line line : loopLines) {
System.out.println(line);
}
ループ ソリューションがある場合は、それを再帰的なソリューションに変更できます。
class RecursiveSearcher {
LinkedList<Line> matchLines = new LinkedList<Line>();
public List<Line> findLines(String text, List<String> lines) {
if (lines.isEmpty()) {
return matchLines;
}
int number = lines.size() - 1;
String line = lines.remove(number);
if (line.contains(text)) {
matchLines.addFirst(new Line(number + 1, line));
}
return findLines(text, lines);
}
}
次の方法でテストできます。
List<String> lines = IOUtils.readLines(new FileInputStream(new File(
"D:/test.txt")));
List<Line> recursiveLines = new RecursiveSearcher().findLines("test",
lines);
for (Line line : recursiveLines) {
System.out.println(line);
}
ご覧のとおり、パラメーターを使用してメソッドを作成しました。
- text - 各行で見つけたいテキスト
- lines - ファイル内のすべての行のリスト。もちろん、
String
すべてのファイル コンテンツを表すことができる raw を提供できます。