编辑:删除了两组的以前的解决方案。有关详细信息,请参见编辑历史记录。
这是一种对任意数量的集合进行递归处理的方法:
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中无法拥有任意数量的通用参数。



