2011-08-28 44 views
5

我有一个对象的数组列表,我想创建所有可能的组合(根据一组简单的规则)。存储在列表中的每个对象都包含一个squadNumber和一个字符串。下面是一个典型列表我存储的一个示例:列表的可能组合

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

我想获得所有组合,其中每个squadNumber只能出现一次,例如:(1,A),(2,A), (3,C),(4,C),则下一个组合将是(1,A),(2,A),(3,C),(4,D)。 我会怎样在java中解决这个问题?通常我会使用嵌套循环,但事实是它全部存储在一个列表中,这使我对事物复杂化。

感谢, paintstripper

+0

使用'Set',如'HashSet',而不是一个列表。套保证唯一性。 – Bohemian

回答

3

EDITED

算法如下:

  1. 拆分所有小队用数字。所以我们列出了队员名单1, 队名2的另一个名单等。
  2. 运行dfs。在第n步,我们添加第n个小队。

代码

// 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

这将是动态的,所以队数可以是任何东西。 – paintstripper

+0

@paintstripper,我已经更新了解决方案。 –

+0

谢谢,这是我需要的:) – paintstripper