2011-08-28 23 views
5

Tengo una lista de objetos que quiero crear todas las combinaciones posibles (de acuerdo con un conjunto simple de reglas). Cada objeto que se almacena en la lista contiene un squadNumber y una cadena. Aquí está un ejemplo de una lista típica estoy en el almacenamiento:Posibles combinaciones de una lista

0: 1, A 
1: 1, B 
2: 2, A 
3: 2, B 
4: 3, C 
5: 3, D 
6: 4, C 
7: 4, D 

quiero conseguir todas las combinaciones en las que cada uno squadNumber sólo puede estar presente una vez, por ejemplo: (1, A), (2, A), (3, C), (4, C), entonces la siguiente combinación sería (1, A), (2, A), (3, C), (4, D). ¿Cómo voy a hacer esto en Java? Usualmente usaría un bucle anidado, pero el hecho de que todo esté almacenado en una lista me complica las cosas.

Gracias, paintstripper

+0

Utilice un 'Set', como' HashSet', no una lista. Establece la unicidad de garantía. – Bohemian

Respuesta

3

EDITADO

algoritmo es el siguiente:

  1. Dividir todos los escuadrones de números. Así que tenemos una lista con escuadrones para 1, otra lista para escuadrones 2, etc.
  2. Ejecute dfs. En el n-ésimo paso agregamos escuadrones con el n-ésimo número.

Código

// Split squads by numbers, so we can iterate through each number independently. 
private Map<Integer, List<Squad>> splitSquadsByNumbers(List<Squad> squads) { 
    Map<Integer, List<Squad>> res = new HashMap<Integer, List<Squad>>(); 
    for (Squad squad : squads) { 
     if (res.get(squad.getNumber()) == null) { 
      res.put(squad.getNumber(), new ArrayList<Squad>()); 
     } 
     res.get(squad.getNumber()).add(squad); 
    } 
    return res; 
} 

List<Integer> squadNumbers; 
Map<Integer, List<Squad>> squadsByNumbers; 
Stack<Squad> stack; 

// Iterating through each squad with number squadNumbers[position] and try to add to stack, at the end pop it from stack. 

private void dfs(int position) { 
    if (position == squadNumber.size()) { 
     System.out.println(stack.toString()); 
    } else { 
     for (Squad squad : squadsByNumbers.get(squadNumber.get(position))) { 
      stack.push(squad); 
      dfs(position + 1); 
      stack.pop(); 
     } 
    } 
} 

private void main(List<Squad> squads) { 
    squadsByNumbers = splitSquadsByNumbers(squads); 
    squadNumber = new ArrayList(squadsByNumber.keySet()); 
    Collections.sort(squadNumbers); 
    stack = new Stack<Squad>(); 
    dfs(0); 
} 
+0

Será dinámico, por lo que los números de escuadrón podrían ser cualquier cosa. – paintstripper

+0

@paintstripper, he actualizado la solución. –

+0

Gracias, esto es EXACTAMENTE lo que necesitaba :) – paintstripper

Cuestiones relacionadas