在Java中寻找笛卡尔积
我想找到元素集的笛卡尔积。这里有一个例子在Java中寻找笛卡尔积,java,math,cartesian-product,Java,Math,Cartesian Product,我想找到元素集的笛卡尔积。这里有一个例子 example 1 : sets :(ab) (bc) (ca) 笛卡尔积是 abc aba acc aca bbc bba bcc bca 笛卡尔积是 zbc-ybc-xbc 因此,我正在考虑一种用java执行的算法,它可以找到编译时定义的特定数量组的笛卡尔积。在(A)。。。但是,它可能不容易翻译成Java。您可以使用from生成笛卡尔产品: com.google.common.collect.Sets.cartesianProduct(Set[]
example 1 :
sets :(ab) (bc) (ca)
笛卡尔积是
abc aba acc aca bbc bba bcc bca
笛卡尔积是
zbc-ybc-xbc
因此,我正在考虑一种用java执行的算法,它可以找到编译时定义的特定数量组的笛卡尔积。在(A)。。。但是,它可能不容易翻译成Java。您可以使用from生成笛卡尔产品:
com.google.common.collect.Sets.cartesianProduct(Set[] yourSets)
要是一切都那么容易就好了 定义您自己的迭代器/Iterable:
import java.util.*;
class CartesianIterator <T> implements Iterator <List <T>> {
private final List <List <T>> lilio;
private int current = 0;
private final long last;
public CartesianIterator (final List <List <T>> llo) {
lilio = llo;
long product = 1L;
for (List <T> lio: lilio)
product *= lio.size ();
last = product;
}
public boolean hasNext () {
return current != last;
}
public List <T> next () {
++current;
return get (current - 1, lilio);
}
public void remove () {
++current;
}
private List<T> get (final int n, final List <List <T>> lili) {
switch (lili.size ())
{
case 0: return new ArrayList <T> (); // no break past return;
default: {
List <T> inner = lili.get (0);
List <T> lo = new ArrayList <T> ();
lo.add (inner.get (n % inner.size ()));
lo.addAll (get (n / inner.size (), lili.subList (1, lili.size ())));
return lo;
}
}
}
}
class CartesianIterable <T> implements Iterable <List <T>> {
private List <List <T>> lilio;
public CartesianIterable (List <List <T>> llo) {
lilio = llo;
}
public Iterator <List <T>> iterator () {
return new CartesianIterator <T> (lilio);
}
}
虽然这给出了期望的结果,但海报要求的是一个算法,而不是预定义的方法……还有,如果海报不能使用这个库怎么办?@keoki:是的,我要求的是算法,但我认为现在对我来说太复杂了……呵呵……太简单了,番石榴的源代码是可用的,所以如果你需要算法,就抓住它吧。
import java.util.*;
class CartesianIterator <T> implements Iterator <List <T>> {
private final List <List <T>> lilio;
private int current = 0;
private final long last;
public CartesianIterator (final List <List <T>> llo) {
lilio = llo;
long product = 1L;
for (List <T> lio: lilio)
product *= lio.size ();
last = product;
}
public boolean hasNext () {
return current != last;
}
public List <T> next () {
++current;
return get (current - 1, lilio);
}
public void remove () {
++current;
}
private List<T> get (final int n, final List <List <T>> lili) {
switch (lili.size ())
{
case 0: return new ArrayList <T> (); // no break past return;
default: {
List <T> inner = lili.get (0);
List <T> lo = new ArrayList <T> ();
lo.add (inner.get (n % inner.size ()));
lo.addAll (get (n / inner.size (), lili.subList (1, lili.size ())));
return lo;
}
}
}
}
class CartesianIterable <T> implements Iterable <List <T>> {
private List <List <T>> lilio;
public CartesianIterable (List <List <T>> llo) {
lilio = llo;
}
public Iterator <List <T>> iterator () {
return new CartesianIterator <T> (lilio);
}
}
class CartesianIteratorTest {
public static void main (String[] args) {
List <Character> la = Arrays.asList (new Character [] {'a', 'b'});
List <Character> lb = Arrays.asList (new Character [] {'b', 'c'});
List <Character> lc = Arrays.asList (new Character [] {'c', 'a'});
List <List <Character>> llc = new ArrayList <List <Character>> ();
llc.add (la);
llc.add (lb);
llc.add (lc);
CartesianIterable <Character> ci = new CartesianIterable <Character> (llc);
for (List<Character> 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 <List <Character>> ();
llc.add (la);
llc.add (lb);
llc.add (lc);
ci = new CartesianIterable <Character> (llc);
for (List<Character> lo: ci)
show (lo);
}
public static void show (List <Character> 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)