有办法在15个大小为5的整数集上做笛卡尔积吗?似乎库抛出了一个异常错误:笛卡尔积太大!
错误信息解释了这个问题:
IllegalArgumentException: Cartesian product too large; must have size at most Integer.MAX_VALUE
15个5长度集合的笛卡尔积产生5^15个不同的结果,即30,517,578,125。因为Set
不可能有大于Integer.MAX_VALUE
的size()
,所以不可能(正确地)返回这么大的集合。正如路易斯·沃瑟曼所指出的那样,你不太可能真的想对如此大量的结果进行操作,因为无论你怎么做,构建300亿个列表都是昂贵的。你最好的办法可能是重新检查这个问题,看看是否有一些解决方案可以避免需要构造这么多结果。
如果你实际上不需要Set
语义,你当然可以用嵌套的for循环一个接一个简单地构造所有的笛卡尔集合(如文档中所述):
for (B b0 : sets.get(0)) {
for (B b1 : sets.get(1)) {
...
ImmutableList<B> tuple = ImmutableList.of(b0, b1, ...);
// operate on tuple
}
}
但是当然不要尝试将它们全部存储在一个集合中-当超过集合的最大大小(或堆空间)时,您将得到一个错误。