Java 从三个列表中生成并输出所有可能的组合<;字符串>;每个唯一项目仅一次

Java 从三个列表中生成并输出所有可能的组合<;字符串>;每个唯一项目仅一次,java,string,arraylist,combinatorics,Java,String,Arraylist,Combinatorics,我试图生成所有可能的句子组合。作为变量,我有两个字符串,一个字符串是主题,例如健康,另一个字符串是对象,例如水果,但是我将有一个列表,其中的值与一个“head”字相关联,因此与刚才提到的两个组件保持一致,它们将与列表相关联[改进、更改、更改、修改]。我想生成这些句子的所有可能组合,并将每个句子添加到列表中,如下所示: Sentence example_sentence = new Sentence(verb, object, subject); sentences.add(example_sen

我试图生成所有可能的句子组合。作为变量,我有两个字符串,一个字符串是主题,例如
健康
,另一个字符串是对象,例如
水果
,但是我将有一个
列表
,其中的值与一个“head”字相关联,因此与刚才提到的两个组件保持一致,它们将与列表相关联
[改进、更改、更改、修改]
。我想生成这些句子的所有可能组合,并将每个句子添加到
列表中,如下所示:

Sentence example_sentence = new Sentence(verb, object, subject);
sentences.add(example_sentence);
现在,发生这种情况的更大的函数如下所示:

public Sentence dataPreprocessing(String raw_subject, String raw_object, String raw_verb, List<Sentence> sentences) throws IOException {
    WordNet wordnet = new WordNet();
    String verb = wordnet.getStem(raw_verb);
    String object = wordnet.getStem(raw_object);        
    String subject = wordnet.getStem(raw_subject);
    List<String> verb_hypernym_container = new ArrayList<>();       
    verb_hypernym_container = wordnet.getHypernyms(verb, POS.VERB);
    //wordnet.getHypernyms(this.object, POS.NOUN);  
    //wordnet.getHypernyms(this.subject, POS.NOUN); 
    Sentence return_sentence = new Sentence( verb, object, subject );
    return return_sentence;
}
公共句子数据预处理(字符串原始主题、字符串原始对象、字符串原始动词、列表句子)引发IOException{
WordNet=newWordNet();
字符串动词=wordnet.getStem(原始动词);
String对象=wordnet.getStem(原始对象);
String subject=wordnet.getStem(原始主题);
列表动词_hypernym_container=new ArrayList();
verb_hypernym_container=wordnet.getHypernyms(动词,POS.verb);
//wordnet.getHypernyms(this.object,POS.NOUN);
//wordnet.getHypernyms(this.subject,POS.NOUN);
句子返回\句子=新句子(动词、宾语、主语);
返回句子;
}

如何才能最有效地实现生成所有可能句子的目标?

由于列表数量固定,最简单的方法就是使用嵌套循环:

List<Sentence> sentences = new ArrayList<>();

for(String verb_hypernym : wordnet.getHypernyms(verb, POS.VERB))
    for(String object_hypernym : wordnet.getHypernyms(object, POS.NOUN))
        for(String subject_hypernym : wordnet.getHypernyms(subject, POS.NOUN))
            sentences.add(new Sentence(verb_hypernym, object_hypernym, subject_hypernym));

return sentences;

一旦你有了一个名词和动词的列表,你就可以使用streams来返回一个句子列表。这也让你有机会删除任何重复的、排序的或者你需要对流执行的任何其他操作

List<Sentence> sentences = subjectList.stream()
        .flatMap(object -> verbList.stream()
            .flatMap(verb -> objectList.stream()
                .map(subject -> new Sentence(object, verb, subject))))
        .distinct()
        .collect(Collectors.toList());
List句子=subjectList.stream()
.flatMap(对象->verbList.stream()
.flatMap(动词->对象列表.stream()
.map(主语->新句子(宾语、动词、主语)))
.distinct()
.collect(Collectors.toList());

每个列表多次生成同一个句子,是否可以使用类似的结构,但每个列表只能生成一次?@Joao.da.Silva什么意思,每个列表一个?就像我不想在一个列表中多次生成同一组合中的相同单词一样time@Joao.da.Silva除非你的一些朋友pernym列表不止一次包含同一个单词。@João.da.Silva如果你的意思是最后一个句子列表不能包含重复的单词,那么最简单的方法是将其设置为一个集合而不是一个列表。但是我可以用三个列表来完成吗?
动词之一
对象之一
主语之一
List<Sentence> sentences = subjectList.stream()
        .flatMap(object -> verbList.stream()
            .flatMap(verb -> objectList.stream()
                .map(subject -> new Sentence(object, verb, subject))))
        .distinct()
        .collect(Collectors.toList());