Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成不同集合的组合_Java_Guava - Fatal编程技术网

Java 生成不同集合的组合

Java 生成不同集合的组合,java,guava,Java,Guava,我有3个相同对象的集合,但每个对象都有一个类似枚举的类型属性 每个集合都有具有相同类型属性的对象。 因此,集合1除了类型属性外,所有对象属性都不同,所有其他集合都相同 现在,我想让这3个集合的所有组合,例如,结果集需要有1项set1、2项set2和1项set3(这是可配置的) 所以我试着将这3个集合合并成一个集合,并使用google guava sets.Combines(bigSet,4)来获得大小为4的集合的所有组合。之后,我会过滤掉不符合这些规则的集合 我担心这不是最有效的方法。因为首先该

我有3个相同对象的集合,但每个对象都有一个类似枚举的类型属性

每个集合都有具有相同类型属性的对象。 因此,集合1除了类型属性外,所有对象属性都不同,所有其他集合都相同

现在,我想让这3个集合的所有组合,例如,结果集需要有1项set1、2项set2和1项set3(这是可配置的)

所以我试着将这3个集合合并成一个集合,并使用google guava sets.Combines(bigSet,4)来获得大小为4的集合的所有组合。之后,我会过滤掉不符合这些规则的集合

我担心这不是最有效的方法。因为首先该方法生成更多的组合,然后我需要,然后我需要过滤3次(每组1次),以删除没有正确数量的类型对象的集合。因此,如果将来我需要一个额外的设置,它需要过滤4次

有没有更好的方法生成这些集合

虚拟类:

public class Dummy {
    String name;
    Type type;

    public Dummy(String name, Type type) {
        this.name = name;
        this.type = type;
    }

    @Override
    public String toString() {
        return "Dummy{" +
                "name='" + name + '\'' +
                ", type=" + type +
                '}';
    }
}
测试代码:

    Dummy d1 = new Dummy("Rik", Type.TYPE1);

    Dummy d2 = new Dummy("John", Type.TYPE2);
    Dummy d3 = new Dummy("Bart", Type.TYPE2);

    Dummy d4 = new Dummy("Elisabeth", Type.TYPE3);
    Dummy d5 = new Dummy("Annie", Type.TYPE3);

    Set<Dummy> dummySet1 = ImmutableSet.of(d1);
    Set<Dummy> dummySet2 = ImmutableSet.of(d2, d3);
    Set<Dummy> dummySet3 = ImmutableSet.of(d4, d5);;

    Set<Dummy> result = new HashSet<Dummy>();
    result.addAll(dummySet1);
    result.addAll(dummySet2);
    result.addAll(dummySet3);
    System.out.println(result);

    Set<Set<Dummy>> combinations = Sets.combinations(result, 4);

    Set<Set<Dummy>> endResult = new HashSet<>();
    for (Set<Dummy> set : combinations) {
        long type1Count = set.stream().filter(s -> s.type == Type.TYPE1).count();
        long type2Count = set.stream().filter(s -> s.type == Type.TYPE2).count();
        long type3Count = set.stream().filter(s -> s.type == Type.TYPE3).count();

        if (type1Count == 1 && type2Count == 2 && type3Count == 1) {
            endResult.add(set);
        }
    }

    for (Set<Dummy> set : endResult) {
        System.out.println(set);
    }
假人d1=新假人(“Rik”,类型1);
假人d2=新假人(“John”,类型2);
假人d3=新假人(“Bart”,类型2);
假人d4=新假人(“伊丽莎白”,类型3);
假人d5=新假人(“安妮”,类型3);
Set dummySet1=ImmutableSet.of(d1);
Set dummySet2=ImmutableSet.of(d2,d3);
Set dummySet3=ImmutableSet.of(d4,d5);;
Set result=new HashSet();
结果:addAll(dummySet1);
结果:addAll(dummySet2);
结果:addAll(dummySet3);
系统输出打印项次(结果);
集合组合=集合组合(结果,4);
Set endResult=new HashSet();
用于(集合:组合){
long type1Count=set.stream().filter(s->s.type==type.TYPE1.count();
long type2Count=set.stream().filter(s->s.type==type.TYPE2.count();
long type3Count=set.stream().filter(s->s.type==type.TYPE3.count();
如果(类型1计数=1&&类型2计数=2&&类型3计数=1){
endResult.add(set);
}
}
用于(设置:endResult){
系统输出打印项次(套);
}

请改用此选项,因为它不会生成无效的组合:

Sets.cartesianProduct(
   Sets.combinations(Set1, set1Count), 
   Sets.combinations(Set2, set2Count), 
   Sets.combinations(Set3, set3Count));

请改用此选项,因为它不会生成无效的组合:

Sets.cartesianProduct(
   Sets.combinations(Set1, set1Count), 
   Sets.combinations(Set2, set2Count), 
   Sets.combinations(Set3, set3Count));

您能提供一些带有示例输入和示例输出的代码吗?我添加了一些示例代码。谢谢。请参阅@kutschkem答案-这是正确的。您能提供一些带有示例输入和示例输出的代码吗?我添加了一些示例代码。谢谢。请看@kutschkem的答案-这是正题。谢谢!很有魅力,谢谢!工作起来很有魅力。