用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。