使用递归将单词逐字添加到集合中

时间:2015-05-27 04:57:32

标签: java recursion set

我试图在java中使用递归将句子的每个单词添加到一个集合中。标点符号无关紧要。

我的问题是,在打印列表后,只打印了句子的第一个单词。

例如句子" One Two Three Four"我的名单中会出现[One]。

int **ptrvectorInt(long dim1) {
   int **v;
   if (!(v = malloc(dim1 * sizeof(int*)))) {
      PyErr_SetString(PyExc_MemoryError,
              "In **ptrvectorInt. Allocation of memory for integer array failed.");
      exit(0); 
   }
   return v;
}

我有什么遗失或忽视的东西吗?

5 个答案:

答案 0 :(得分:1)

你应该将你的递归函数的返回值的结果添加到你的结果集中,(你也没考虑最后一个单词),像这样(我在评论中给出解释)

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

答案 1 :(得分:0)

照顾范围。您的TreeSet是一个局部变量,每次使用新函数调用该函数时,它都会被覆盖。

尝试将其声明为函数外的全局变量。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我只会将您的动态编程作为练习来解决,请注意,这种解决方案不是解决您任务的好方法。

在你的方法的每次调用中,你实例化一个新的Set,你最终会扔掉它,然后返回第一个包含第一个单词的Set。您需要在递归方法之外创建集合对象,然后通过引用传递它,如下所示:

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);将添加最后一个单词。

在这里演示:http://ideone.com/ruEMjA

答案 4 :(得分:0)

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

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

}

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