Voglio calcolare il prodotto cartesiano di un numero arbitrario di set di caratteri non vuoti in Java.Prodotto cartesiano iterativo in Java
ho scritto che il codice 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;
}
... ma ho trovato piuttosto poco elegante. Qualcuno ha una migliore soluzione ancora iterativo? Una soluzione che utilizza un meraviglioso approccio di tipo funzionale? Altrimenti ... suggerimento su come migliorarlo? Errori?
grazie mille! :) – akappa
Qual è la ragione per implementare questo solo per gli insiemi, e non in generale per Iterables (cioè dato un elenco di Iterables, restituisce un Iterable di elenchi)? Ovviamente per gli insiemi si può fare un po 'di più come un controllo facile da contenere, ma io avevo solo bisogno di questo quando non avevo set disponibili (e dovevo implementarlo io stesso). –