Java 造句功能

Java 造句功能,java,Java,我有以下功能: public ArrayList<ArrayList<Word>> createSentences(ArrayList<ArrayList<Word>> gestures, int startIndex) { if (gestures.size() == 1) { return gestures; } Array

我有以下功能:

      public ArrayList<ArrayList<Word>> createSentences(ArrayList<ArrayList<Word>> gestures, int startIndex) {
            if (gestures.size() == 1) {

                return gestures;
            }


            ArrayList<Word> ret;
            ArrayList<ArrayList<Word>> result = new ArrayList<ArrayList<Word>>();

            ArrayList<Word> tmp1 = gestures.get(0);
            gestures.remove(0);
            ArrayList<ArrayList<Word>> tmp2 = createSentences(gestures, startIndex + 1);


            for (Word s : tmp1) {
                for (Word s2 : tmp2.get(0)) {
                    ret = new ArrayList<Word>();
                    ret.add(s);
                    ret.add(s2);
                    result.add(ret);


                }


            }


 return result;
    }
这很好,但给出了一个输入:

ArrayList<ArrayList<Word>> test= new ArrayList<ArrayList<Word>>();

        ArrayList<Word> gest1 = new ArrayList<Word>();
        gest1.add(new Word("A", "N"));
        gest1.add(new Word("B", "V"));

         ArrayList<Word> gest2 = new ArrayList<Word>();
        gest2.add(new Word("C", "N"));
        gest2.add(new Word("D", "V"));



        test.add(gest1);
        test.add(gest2);
ArrayList<ArrayList<Word>> test= new ArrayList<ArrayList<Word>>();

        ArrayList<Word> gest1 = new ArrayList<Word>();
        gest1.add(new Word("A", "N"));
        gest1.add(new Word("B", "V"));

         ArrayList<Word> gest2 = new ArrayList<Word>();
        gest2.add(new Word("C", "N"));
        gest2.add(new Word("D", "V"));

         ArrayList<Word> gest3 = new ArrayList<Word>();
        gest3.add(new Word("E", "N"));
        gest3.add(new Word("F", "V"));

        test.add(gest1);
        test.add(gest2);
        test.add(gest3);
我希望实现所有可能的匹配组合,如下所示:

[A, C, E]
[A, C, F]
[A, D, E]
[A, D, F]
[B, C, E]
[B, C, F]
[B, D, E]
[B, D, F]

有人能帮我重写函数以产生想要的结果吗。

在已经存在的两个循环中嵌套另一个循环

或者使用递归算法,该算法可以处理任意数量的输入单词列表

[编辑]

为了让您更容易理解正在发生的事情,以下是一些建议:

  • 创建新类型,如
    class WordList extensed ArrayList{}
    class-sensume extensed ArrayList{}
    ,这有助于明确您想要的内容。代码将更具可读性

  • 将助手方法添加到新类型中。例如,将
    List appendWords(WordList)
    添加到
    句子
    ,以从原始句子创建新句子,其中每个句子都附加了单词列表中的一个单词。这使得代码保持简单:每个方法只做一件事

  • 这使得最终的算法非常简单:

    List<Sentence> result = new ArrayList<Sentence>();
    result.add( new Sentence() ); // start with an empty sentence
    
    for( WordList words : wordLists ) {
        List<Sentence> tmp = new ArrayList<Sentence>();
    
        for( Sentence s : result ) {
            tmp.addAll( s.appendWords( words ) );
        }
    
        result = tmp;
    }
    
    List result=new ArrayList();
    结果。添加(新句子());//从一句空话开始
    for(单词列表单词:单词列表){
    List tmp=new ArrayList();
    for(句子s:结果){
    tmp.addAll(s.appendWords(words));
    }
    结果=tmp;
    }
    
    对于主循环的每次迭代,下一个单词列表中的所有单词都会附加到所有以前的结果中。

    此行

    for (Word s2 : tmp2.get(0)) {
    
    意思是“对于tmp2的第一个句子中的每个单词”。为什么你忽略了其他句子
    tmp2.get(1)
    tmp2.get(2)
    ,等等

    您需要的是,“将tmp1中的每个单词添加到tmp2中的每个句子中”,对吗

    for(单词:tmp1){
    for(列表语句:tmp2){
    List tempstation=new ArrayList();
    添加(单词);
    临时句子。添加所有(句子);
    结果。添加(临时句子);
    }
    }
    
    您是否已尝试调试代码以了解发生这种情况的原因?是的。我已经花了大约4个小时在这个问题上,但都搞混了,不知道如何解决它。是的,它必须适用于任何数量的输入单词列表。你能给我一个如何使用递归算法的例子吗?难道不应该有tempstance.add(word);而不是临时语句。添加(tmp1);因为这个不会编译。它仍然不能给出正确的结果。它应该将位置1中的每个单词与位置2中的每个单词以及位置3中的每个单词进行匹配。来自同一位置的单词无法匹配。
    List<Sentence> result = new ArrayList<Sentence>();
    result.add( new Sentence() ); // start with an empty sentence
    
    for( WordList words : wordLists ) {
        List<Sentence> tmp = new ArrayList<Sentence>();
    
        for( Sentence s : result ) {
            tmp.addAll( s.appendWords( words ) );
        }
    
        result = tmp;
    }
    
    for (Word s2 : tmp2.get(0)) {
    
    for (Word word : tmp1) {
      for (List<Word> sentence : tmp2) {
        List<Word> tempSentence = new ArrayList<Word>();
        tempSentence.add(word);
        tempSentence.addAll(sentence);
        result.add(tempSentence);
      }
    }