使用递归将句子逐字添加到集合中

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 结尾。

此处演示:http://ideone.com/ruEMjA

这是基于您的原始实现的递归解决方案。

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);
        }
    }

}

递归地解决问题。我不知道你为什么要这样做,但这不是最好的方法。