gpt4 book ai didi

java - 生成不同集合的组合

转载 作者:行者123 更新时间:2023-12-01 19:52:11 25 4
gpt4 key购买 nike

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

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

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

所以我尝试的是将这 3 个集合合并为一个集合,并使用 google guava Sets.combinations(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);
}

最佳答案

使用它,因为它不会生成无效的组合:

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

关于java - 生成不同集合的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50982901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com