使用递归将句子逐字添加到集合中
Adding a sentence word by word into a set using Recursion
我试图在 java 中使用递归将句子的每个单词添加到一个集合中。标点符号无关紧要。
我的问题是打印列表后只打印了句子的第一个单词。
例如,句子 "One Two Three Four" 会在我的列表中显示为 [One]。
public static TreeSet<String> getWordSet(String words) {
TreeSet<String> result = new TreeSet<String>();
int index = words.indexOf(" ");
if (index < 0) {
return result;
} else {
result.add(words.substring(0, index));
getWordSet(words.substring(index + 1));
}
return result;
}
我是否遗漏或忽略了什么?
注意范围。你的 TreeSet 是一个局部变量,每次你用一个新的调用函数时它都会被覆盖。
尝试将其声明为函数外的全局变量。
你应该把你的递归函数返回值的结果添加到你的结果集中,(你也没有考虑最后一个词),像这样(我在评论中解释)
public static TreeSet<String> getWordSet(String words) {
TreeSet<String> result = new TreeSet<String>();
int index = words.indexOf(" ");
if (index < 0 && words.length() == 0) {
return result;
}else if (index < 0 && words.length() > 0) { // here you didnt consider the last word
result.add(words);
} else {
result = getWordSet(words.substring(index + 1)); //here we first get result of recursion then add our new value to the list
result.add(words.substring(0, index));
}
return result;
}
private static TreeSet<String> result = new TreeSet<String>();
public static TreeSet<String> getWordSet(String words) {
int index = words.indexOf(" ");
if (index < 0 && words != null) {
return result;
} else if (index < 0 && words.length() > 0) {
result.add(words);
} else {
result = getWordSet(words.substring(index + 1));
result.add(words.substring(0, index));
}
return result;
}
我在这里只将您的动态规划作为练习来解决,请注意,这种解决方案不是解决您的任务的好方法。
在您的方法的每次调用中,您都在实例化一个新的 Set,您最终会丢弃它,而只是 return 第一个包含第一个单词的集合。您需要在递归方法之外创建集合对象,然后通过引用传递它,如下所示:
public static void main (String[] args) throws java.lang.Exception
{
Set<String> set = new TreeSet<String>();
getWordSet("get word set", set);
System.out.println(set.toString());
}
public static void getWordSet(String words, Set set) {
int index = words.indexOf(" ");
if (index < 0) {
if (words.length() > 0) set.add(words);
} else {
set.add(words.substring(0, index));
getWordSet(words.substring(index + 1), set);
}
}
行 if (words.length() > 0) set.add(words);
将添加最后一个单词,以防输入字符串不以 space 结尾。
这是基于您的原始实现的递归解决方案。
import java.util.TreeSet;
public class RecursiveSplit {
public static TreeSet<String> getWordSet(String sentence, TreeSet<String> mySet) {
int index = sentence.indexOf(" ");
if (index < 0)
if (sentence.length()>0)
index = sentence.length() - 1;
else
return mySet;
mySet.add(sentence.substring(0, index));
getWordSet(sentence.substring(index+1), mySet);
return mySet;
}
public static TreeSet<String> getWordSetDriver(String sentence){
TreeSet<String> blankSet = new TreeSet<String>();
return getWordSet(sentence, blankSet);
}
public static void main(String[] args) {
for (String s : getWordSetDriver("This is a sentence.")) {
System.out.println(s);
}
}
}
递归地解决问题。我不知道你为什么要这样做,但这不是最好的方法。
我试图在 java 中使用递归将句子的每个单词添加到一个集合中。标点符号无关紧要。
我的问题是打印列表后只打印了句子的第一个单词。
例如,句子 "One Two Three Four" 会在我的列表中显示为 [One]。
public static TreeSet<String> getWordSet(String words) {
TreeSet<String> result = new TreeSet<String>();
int index = words.indexOf(" ");
if (index < 0) {
return result;
} else {
result.add(words.substring(0, index));
getWordSet(words.substring(index + 1));
}
return result;
}
我是否遗漏或忽略了什么?
注意范围。你的 TreeSet 是一个局部变量,每次你用一个新的调用函数时它都会被覆盖。
尝试将其声明为函数外的全局变量。
你应该把你的递归函数返回值的结果添加到你的结果集中,(你也没有考虑最后一个词),像这样(我在评论中解释)
public static TreeSet<String> getWordSet(String words) {
TreeSet<String> result = new TreeSet<String>();
int index = words.indexOf(" ");
if (index < 0 && words.length() == 0) {
return result;
}else if (index < 0 && words.length() > 0) { // here you didnt consider the last word
result.add(words);
} else {
result = getWordSet(words.substring(index + 1)); //here we first get result of recursion then add our new value to the list
result.add(words.substring(0, index));
}
return result;
}
private static TreeSet<String> result = new TreeSet<String>();
public static TreeSet<String> getWordSet(String words) {
int index = words.indexOf(" ");
if (index < 0 && words != null) {
return result;
} else if (index < 0 && words.length() > 0) {
result.add(words);
} else {
result = getWordSet(words.substring(index + 1));
result.add(words.substring(0, index));
}
return result;
}
我在这里只将您的动态规划作为练习来解决,请注意,这种解决方案不是解决您的任务的好方法。
在您的方法的每次调用中,您都在实例化一个新的 Set,您最终会丢弃它,而只是 return 第一个包含第一个单词的集合。您需要在递归方法之外创建集合对象,然后通过引用传递它,如下所示:
public static void main (String[] args) throws java.lang.Exception
{
Set<String> set = new TreeSet<String>();
getWordSet("get word set", set);
System.out.println(set.toString());
}
public static void getWordSet(String words, Set set) {
int index = words.indexOf(" ");
if (index < 0) {
if (words.length() > 0) set.add(words);
} else {
set.add(words.substring(0, index));
getWordSet(words.substring(index + 1), set);
}
}
行 if (words.length() > 0) set.add(words);
将添加最后一个单词,以防输入字符串不以 space 结尾。
这是基于您的原始实现的递归解决方案。
import java.util.TreeSet;
public class RecursiveSplit {
public static TreeSet<String> getWordSet(String sentence, TreeSet<String> mySet) {
int index = sentence.indexOf(" ");
if (index < 0)
if (sentence.length()>0)
index = sentence.length() - 1;
else
return mySet;
mySet.add(sentence.substring(0, index));
getWordSet(sentence.substring(index+1), mySet);
return mySet;
}
public static TreeSet<String> getWordSetDriver(String sentence){
TreeSet<String> blankSet = new TreeSet<String>();
return getWordSet(sentence, blankSet);
}
public static void main(String[] args) {
for (String s : getWordSetDriver("This is a sentence.")) {
System.out.println(s);
}
}
}
递归地解决问题。我不知道你为什么要这样做,但这不是最好的方法。