为了账号安全,请及时绑定邮箱和手机立即绑定

Java中任意集的笛卡尔积

Java中任意集的笛卡尔积

米琪卡哇伊 2019-07-03 10:09:37
Java中任意集的笛卡尔积您知道一些简洁的Java libary允许您生成两个(或更多)集合的笛卡儿积吗?例如:我有三套。一个是类人物的对象,第二个是礼物类的对象,第三个是吉夫特扩展类的对象。我想要生成一套包含所有可能的三元组的人-礼物-吉夫特扩展。集合的数量可能会有所不同,所以我不能在嵌套的foreach循环中这样做。在某些情况下,我的应用程序需要制作一个人-礼物对的产品,有时是三人-礼物-吉夫特扩展,有时甚至可能有设置Person-Gift-GiftExtension-GiftSecondExtension-GiftThirdExtension,等。
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

删除了两个集合的先前解决方案。有关详细信息,请参阅编辑历史记录。

这里有一种方法可以递归地对任意数量的集合执行此操作:

public static Set<Set<Object>> cartesianProduct(Set<?>... sets) {
    if (sets.length < 2)
        throw new IllegalArgumentException(
                "Can't have a product of fewer than two sets (got " +
                sets.length + ")");

    return _cartesianProduct(0, sets);}private static Set<Set<Object>> _cartesianProduct(int index, Set<?>... sets) {
    Set<Set<Object>> ret = new HashSet<Set<Object>>();
    if (index == sets.length) {
        ret.add(new HashSet<Object>());
    } else {
        for (Object obj : sets[index]) {
            for (Set<Object> set : _cartesianProduct(index+1, sets)) {
                set.add(obj);
                ret.add(set);
            }
        }
    }
    return ret;}

请注意,不可能在返回的集合中保留任何泛型类型信息。如果事先知道您想要的产品有多少集,则可以定义一个泛型元组来保存这些元素(例如Triple<A, B, C>),但是在Java中不可能有任意数量的泛型参数。


查看完整回答
反对 回复 2019-07-03
?
PIPIONE

TA贡献1829条经验 获得超9个赞

集合的数量可能会有所不同,所以我不能在嵌套的foreach循环中这样做。

两个提示:

  • AxBxC=Ax(BxC)
  • 递归


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 1347 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信