句子创建功能

时间:2011-08-30 12:22:09

标签: java

我有以下功能:

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

它产生以下结果:

[A, C]
[A, D]
[B, C]
[B, D]

这很好,但给出了一个输入:

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]
[A, E]
[B, C]
[B, E]

我想在这里实现所有可能的匹配组合:

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

有人可以帮助我并重写功能以产生想要的结果。

2 个答案:

答案 0 :(得分:2)

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

或者使用递归算法,该算法适用于任意数量的输入单词列表。

<强> [编辑]

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

  1. 创建新类型,例如class WordList extends ArrayList<Word> {}class Sentence extends ArrayList<Word> {}这有助于明确您想要的内容。代码将更具可读性。

  2. 为新类型添加辅助方法。例如,将List<Sentence> appendWords( WordList )添加到Sentence以创建来自原始句子的新句子,其中每个句子都附加了单词列表中的一个单词。这使您可以保持代码简单:每种方法都完成一件事。

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

    对于主循环的每次迭代,下一个单词列表的所有单词都会附加到之前的所有结果中。

答案 1 :(得分:0)

这一行

for (Word s2 : tmp2.get(0)) {

表示“tmp2的第一个句子中的每个单词”。为什么忽略其他句子tmp2.get(1)tmp2.get(2)等?

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

for (Word word : tmp1) {
  for (List<Word> sentence : tmp2) {
    List<Word> tempSentence = new ArrayList<Word>();
    tempSentence.add(word);
    tempSentence.addAll(sentence);
    result.add(tempSentence);
  }
}