Quiero calcular el producto cartesiano de un número arbitrario de conjuntos no vacíos en Java.Producto cartesiano iterativo en Java
Me he escrito que el código iterativo ...
public static <T> List<Set<T>> cartesianProduct(List<Set<T>> list) {
List<Iterator<T>> iterators = new ArrayList<Iterator<T>>(list.size());
List<T> elements = new ArrayList<T>(list.size());
List<Set<T>> toRet = new ArrayList<Set<T>>();
for (int i = 0; i < list.size(); i++) {
iterators.add(list.get(i).iterator());
elements.add(iterators.get(i).next());
}
for (int j = 1; j >= 0;) {
toRet.add(Sets.newHashSet(elements));
for (j = iterators.size()-1; j >= 0 && !iterators.get(j).hasNext(); j--) {
iterators.set(j, list.get(j).iterator());
elements.set(j, iterators.get(j).next());
}
elements.set(Math.abs(j), iterators.get(Math.abs(j)).next());
}
return toRet;
}
... pero me pareció bastante poco elegante. ¿Alguien tiene una mejor solución aún iterativa? ¿Una solución que utiliza algún maravilloso enfoque funcional? De lo contrario ... sugerencia sobre cómo mejorarlo? ¿Errores?
muchas gracias! :) – akappa
¿Cuál es la razón para implementar esto solo para conjuntos, y no generalmente para Iterables (es decir, dada una lista de Iterables, devolver un Iterable de listas)? Por supuesto, para Sets puedes hacer algo más como comprobar fácilmente si contiene, pero solo necesitaba esto cuando no tenía ningún conjunto disponible (y tuve que implementarlo yo mismo). –