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