2011-08-30 61 views
0

我有以下功能:文章生成功能

 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] 

有人可以幫我和重寫功能,產生想要的結果。

+0

你有沒有嘗試過,並嘗試調試代碼,看看爲什麼會發生這種情況? – luketorjussen

+0

是的。我已經花了大約4個小時,但所有的混淆,不知道如何解決它。 – Radek

回答

2

在另一個已存在的環中嵌套另一個環。

或者使用遞歸算法,該算法將適用於任意數量的輸入單詞列表。

[編輯]

爲了使它更簡單的讓你明白是怎麼回事,這裏有一些建議:

  1. class WordList extends ArrayList<Word> {}class Sentence extends ArrayList<Word> {}這有助於創建新類型明確你想要的。代碼將更具可讀性。

  2. 將輔助方法添加到新類型中。例如,將List<Sentence> appendWords(WordList)添加到Sentence以從原始句子創建新句子,其中每個句子都附加了單詞列表中的一個單詞。這可以讓你保持簡單的代碼:每個方法只做一件事。

這讓你做最後的算法很簡單:

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

對於主循環的每一次迭代中,下一個單詞列表的所有單詞都附加到所有以前的結果。

+0

是的,它必須適用於任何數量的輸入單詞列表。你能給我一個例子如何使用遞歸算法? – Radek

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

不應該有 tempSentence.add(word); 而不是 tempSentence.add(tmp1); 因爲這個不會編譯。 – Radek

+0

@Radek - 是的。固定。 – Ishtar

+0

它仍然沒有給出正確的結果。它將來自位置1的每個單詞與來自位置2的每個單詞和來自位置3的每個單詞匹配。來自相同位置的單詞不能匹配。 – Radek