Предположим, у вас есть этот словарь:
disc
on
so
lateness
И предположим, что вы запускаете свою программу для строки disconsolateness
.Я внес некоторые изменения, чтобы сначала загрузить словарь, а затем вызвать рекурсивный метод splitWord
.
. Вы должны знать, что рекурсивные методы вызываются полностью, помещая их в стек, а затем возвращаться по одному вызову за другим.Поэтому я решил изменить рекурсивный вызов на:
return prefix + " " + splitWord(word.substring(i), output);
, чтобы каждое найденное слово объединялось после каждого вызова метода.
Очевидно, что, как вы уже сделали, мое условие остановки сохраняется, когдав переменной output
.
package io.gdfb.questions;
import java.util.*;
import java.io.*;
public class CompositionTwo {
private static List<String> dictionary = new ArrayList<>();
public static void main(String[] args) {
loadDictionary();
File outputFile = new File("composedMore.txt");
PrintWriter out = null;
try {
out = new PrintWriter(outputFile);
String output = splitWord(args[0], "");
if (output != "") {
out.println(args[0] + ":" + output);
}
} catch (IOException e) {
System.out.println("An IOException has occurred during output process.");
} finally {
out.flush();
out.close();
}
}
private static void loadDictionary() {
InputStream inputFile = Thread.currentThread().getContextClassLoader().getResourceAsStream("dictionary.txt");
Scanner in = null;
try {
in = new Scanner(inputFile);
while (in.hasNext()) {
String input = in.next();
dictionary.add(input);
}
} finally {
in.close();
}
}
public static String splitWord(String word, String output) {
for (int i = 1; i <= word.length(); i++) {
// consider all prefixes of current String
String prefix = word.substring(0, i);
// if the prefix is present in the dictionary, add prefix to the
// output String and recurse for remaining String
if (dictionary.contains(prefix)) {
return prefix + " " + splitWord(word.substring(i), output);
}
}
return output;
}
}
больше нет символов