在 Java 中,计算两个或多个集合的笛卡尔积是一种常见的操作。这涉及生成一个新集合,其中包含输入集合中所有可能的元素组合。
使用嵌套循环的传统方法在处理任意数量的集合时可能会变得很麻烦。相反,请考虑递归方法:
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<>(); if (index == sets.length) { ret.add(new HashSet<>()); } else { for (Object obj : sets[index]) { for (Set<Object> set : _cartesianProduct(index + 1, sets)) { set.add(obj); ret.add(set); } } } return ret; }
请注意,由于 Java 泛型参数系统的限制,此递归实现会丢失泛型类型信息。为了保留类型信息,请考虑为所涉及的集合的数量定义特定的元组类,例如 Triple 。三套。然而,这种方法对于任意数量的集合来说是不切实际的。
以上是如何在Java中高效计算多个集合的笛卡尔积?的详细内容。更多信息请关注PHP中文网其他相关文章!