用Java查找笛卡尔积

我想找到一组元素的笛卡尔积。 这是一个例子

example 1 : sets :(ab) (bc) (ca) 

笛卡儿的产品是,

abc aba acc aca bbc bba bcc bca

 example 2 : sets : (zyx) bc 

笛卡儿的产品是,

zbc ybc xbc

所以我在想一个在java中执行的算法,它可以找到在编译时在开始时定义的特定数量的组的笛卡尔积。

您可以使用Google的Guava库中的Sets.cartesianProduct()方法生成笛卡尔积:

 com.google.common.collect.Sets.cartesianProduct(Set[] yourSets) 

如果只有一切都那么容易!

定义自己的Iterator / Iterable:

 import java.util.*; class CartesianIterator  implements Iterator > { private final List > lilio; private int current = 0; private final long last; public CartesianIterator (final List > llo) { lilio = llo; long product = 1L; for (List  lio: lilio) product *= lio.size (); last = product; } public boolean hasNext () { return current != last; } public List  next () { ++current; return get (current - 1, lilio); } public void remove () { ++current; } private List get (final int n, final List > lili) { switch (lili.size ()) { case 0: return new ArrayList  (); // no break past return; default: { List  inner = lili.get (0); List  lo = new ArrayList  (); lo.add (inner.get (n % inner.size ())); lo.addAll (get (n / inner.size (), lili.subList (1, lili.size ()))); return lo; } } } } class CartesianIterable  implements Iterable > { private List > lilio; public CartesianIterable (List > llo) { lilio = llo; } public Iterator > iterator () { return new CartesianIterator  (lilio); } } 

并使用您的数据进行测试:

 class CartesianIteratorTest { public static void main (String[] args) { List  la = Arrays.asList (new Character [] {'a', 'b'}); List  lb = Arrays.asList (new Character [] {'b', 'c'}); List  lc = Arrays.asList (new Character [] {'c', 'a'}); List > llc = new ArrayList > (); llc.add (la); llc.add (lb); llc.add (lc); CartesianIterable  ci = new CartesianIterable  (llc); for (List lo: ci) show (lo); la = Arrays.asList (new Character [] {'x', 'y', 'z'}); lb = Arrays.asList (new Character [] {'b'}); lc = Arrays.asList (new Character [] {'c'}); llc = new ArrayList > (); llc.add (la); llc.add (lb); llc.add (lc); ci = new CartesianIterable  (llc); for (List lo: ci) show (lo); } public static void show (List  lo) { System.out.print ("("); for (Object o: lo) System.out.print (o); System.out.println (")"); } } 

结果:

 (abc) (bbc) (acc) (bcc) (aba) (bba) (aca) (bca) (xbc) (ybc) (zbc) 

在本文中可以找到一种纯粹的function性方法( “function珍珠” )……但是,它可能不容易转换为Java。