generando el poder cartesiano de un conjunto

¿Existe una forma rápida de generar el poder cartesiano de un conjunto?

Por ejemplo, si el conjunto es {1, 2}, entonces {1, 2} x {1, 2} = {(1, 1), (1, 2), (2, 1), (2, 2) }. ¿Cómo haría para generarlo para cualquier potencia dada?

Gracias.

Respuesta 1

Supongo que con potencia , ¿quieres decir con qué frecuencia se combina el conjunto consigo mismo? Entonces el poder 3 sería:

{1, 2} x {1, 2} x {1, 2} = (({1, 2} x {1, 2}) x {1, 2}) 

para que pueda resolverlo de forma recursiva, combine el conjunto una vez y luego el conjunto con el resultado ...

Si lo desea, puede adaptar mi Iterator for Lists of Lists a List of Sets y crear un interator: 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 <Set <T>> llo) {
    // transform Set<T> to List <T>, because we need an index later
        List <List <T>> llt = new ArrayList <List <T>> ();    
        for (Set <T> st : llo)
        {
        List <T> lt = new ArrayList <T> ();
        for (T t: st)
            lt.add (t);
        llt.add (lt);
    }
        lilio = llt;
        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 <Set <T>> lilio;  

    public CartesianIterable (List <Set <T>> llo) {
        lilio = llo;
    }

    public Iterator <List <T>> iterator () {
        return new CartesianIterator <T> (lilio);
    }
}

public class SetItTest 
{
    public static void main ( String [] args )
    {
        Set <Integer> si = new HashSet<Integer> ();
        si.add (1);
        si.add (2);
        List <Set<Integer>> ls = new ArrayList <Set<Integer>> ();
        ls.add (si);
        ls.add (si);
        ls.add (si);
        CartesianIterable <Integer> ci = new CartesianIterable <Integer> (ls); 
        for (List <Integer> li : ci) 
        {
            for (int i : li)
                System.out.print (i + " ");
            System.out.println ();
        }
    }
}

Salida: Java SetItTest

1 1 1 
2 1 1 
1 2 1 
2 2 1 
1 1 2 
2 1 2 
1 2 2 
2 2 2 
Respuesta: 2

Si puede usar bibliotecas externas, Guava lo ha hecho Sets.cartesianProduct(Set<E>...), por lo que puede hacer lo siguiente:

Set<Integer> set = ImmutableSet.of(1, 2);
Set<List<Integer>> = Sets.cartesianProduct(set, set);
// returns {[1, 1], [1, 2], [2, 1], [2, 2]} as desired

(Divulgación: contribuyo a la guayaba).

Respuesta: 3

Se trata de generar matrices de longitud n con elementos X e Y (su caso 1 y 2). Codifique algo como esto:

1 - primer elemento (X) 2 - segundo elemento (Y) ... y así sucesivamente. Luego genera todas las cadenas con 1,2, ..., n de longitud n. Ejemplo: 11, 12, 21, 22. // n = 2111, 112, 121, 122, 211, 212, 221, 222 // n = 3 Vuelva a sus elementos originales reemplazando 1, 2, ... n con tus elementos reales

Estoy bastante seguro de que algunas bibliotecas ya tienen esta función implementada.

Respuesta: 4

Quiero obtener la salida de este método myLogger.log (e) en una variable de cadena para poder probar con Junit. myLogger.log (e); Cadena s = ???? afirmar Igual (esperado, s);

¿Cómo solucionar la excepción? ¿No se pudo conectar al host SMTP: localhost, puerto: 25 mientras se envía correo electrónico desde la aplicación Java y cómo usar un número de puerto alternativo para enviar correo que no sea el puerto no: 25?

Tengo una vista de árbol y quería agregar compatibilidad con el botón derecho para los diferentes elementos. Así es como lo hice: http://jsfiddle.net/doonot/xWjSz/ El menú se muestra solo para el primer módulo raíz (después de ...

Mi programa Java llama a un procedimiento almacenado de Oracle en un servidor de base de datos. Obtenga el conjunto de resultados y desee pasar ese conjunto de resultados a mi procedimiento almacenado en otro servidor de base de datos. ¿Cómo puedo pasar el ...