我有以下功能:
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 :(得分:2)
在已存在的两个循环中嵌套另一个循环。
或者使用递归算法,该算法适用于任意数量的输入单词列表。
<强> [编辑] 强>
为了让您更容易理解正在发生的事情,以下是一些建议:
创建新类型,例如class WordList extends ArrayList<Word> {}
和class Sentence extends ArrayList<Word> {}
这有助于明确您想要的内容。代码将更具可读性。
为新类型添加辅助方法。例如,将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;
}
对于主循环的每次迭代,下一个单词列表的所有单词都会附加到之前的所有结果中。
答案 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);
}
}