2011-08-28 5 views
5

मेरे पास ऑब्जेक्ट्स की एक सरणी सूची है जिसे मैं सभी संभावित संयोजन बनाना चाहता हूं (नियमों के एक साधारण सेट के अनुसार)। सूची में संग्रहीत प्रत्येक ऑब्जेक्ट में एक टीम नम्बर और एक स्ट्रिंग होती है।सूची के संभावित संयोजन

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, ए), (2, ए), (3, सी), (4, सी) तो अगला संयोजन (1, ए), (2, ए), (3, सी), (4, डी) होगा। मैं जावा में इसके बारे में कैसे जाऊं? आम तौर पर मैं एक नेस्टेड लूप का उपयोग करता हूं, लेकिन तथ्य यह है कि यह एक सूची में संग्रहीत किया जा रहा है, मेरे लिए चीजों को जटिल बनाता है।

धन्यवाद, paintstripper

+0

एक 'इस तरह के' HashSet', एक नहीं सूची के रूप में Set', का प्रयोग करें। सेट विशिष्टता की गारंटी देता है। – Bohemian

उत्तर

3

एल्गोरिथ्म पीछा कर रहा है संपादित:

  1. स्प्लिट संख्या द्वारा सभी दस्तों। तो हमारे पास स्क्वाड के साथ 1, स्क्वाड 2, आदि के लिए दूसरी सूची है
  2. रन dfs। एनएचटी चरण में हम एनएच नंबर के साथ स्क्वाड जोड़ते हैं।

कोड

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

@ पेंटस्ट्रिपर, मैंने समाधान अपडेट किया है। –

+0

धन्यवाद, यह वही है जो मुझे चाहिए :) – paintstripper