【问题标题】:Generate combinations of different sets生成不同集合的组合
【发布时间】:2018-06-22 07:33:30
【问题描述】:

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

每个集合都有具有相同类型属性的对象。 所以设置 1 所有对象属性都不同,除了 type 属性,所有其他设置都相同。

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

所以我尝试将这 3 个集合合并为一个集合,并使用 google guava Sets.combinations(bigSet, 4) 来获取这些大小为 4 的集合的所有组合。然后我会过滤掉那些没有的集合t 满足这些规则。

我担心这不是最有效的方法。因为首先该方法会生成更多组合然后我需要然后我需要过滤 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);
    }

【问题讨论】:

  • 您能提供一些带有示例输入和示例输出的代码吗?
  • 我添加了一些示例代码。
  • 谢谢。请参阅@kutschkem 答案 - 切中要害。

标签: java guava


【解决方案1】:

改用这个,因为它不会产生无效的组合:

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

【讨论】:

  • 谢谢!像魅力一样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多