2013-12-07 76 views
2

對於給定的Collection<Object> aCollection,如何在aCollection(除了自耦合)之外建立ArrayList<OrderedCouple<Object>>以及所有可能的對偶排列。構建隨機排列列表的最有效方法

例如,假設aCollection是包含teamAteamBteamC一個Set<Team>OrderedCouple是不是類Game<Team>其構造函數接收兩個團隊,賓主作爲參數。 我想在Team之間建立所有可能的Game s的ArrayList s。也就是說,ArrayList將以隨機順序爲{new Game(teamA, teamB), new Game(teamA, teamC), new Game(teamB, teamA), new Game(teamB, teamC), new Game(teamC, teamA), new Game(teamC, teamB)}

+0

從和itertools.permutations導入......哦,等等,這是Java的:((爲什麼標準API有這樣的東西 – arynaq

+0

@arynaq - 哈哈:) – Elist

+0

我認爲番石榴圖書館可以幫助你使用Collections2相當容易地得到一些東西 http://docs.guava-libraries.googlecode.com/git/javadoc/COM /谷歌/普通/ COLLEC t/Collections2.html#orderedPermutations(java.lang.Iterable) – umhelp

回答

2

我想不出比這更快的方法:

@Test 
public void buildMatchUps() { 
    List<String> teams = Arrays.asList("A", "B", "C"); 
    int s = teams.size() * teams.size() - teams.size(); 
    List<String> matchUps = new ArrayList<String>(s); 
    for(String host : teams) { 
     for(String guest : teams) { 
      if(host != guest) { // ref comparison, because the objects 
           // come from the same list. Otherwise 
           // equals should be used! 
       matchUps.add(host + " : " + guest); 
      } 
     } 
    } 
    Collections.shuffle(matchUps); 
    for(String matchUp : matchUps) { 
     System.out.println(matchUp); 
    } 
} 

版畫是這樣的:

C : A 
B : A 
A : C 
C : B 
B : C 
A : B 
+0

此列表並非隨機... – Elist

+0

請注意,此代碼運行於'O(n^2)'。更具體地說'k = teams.size()',它運行在'O(n^k)'中。但對於小型團隊和少量的設定數量(本例中爲2個團隊),它會正常工作。 – skiwi

+1

@Elist使用這段代碼,然後創建'Game'對象的'List',然後調用'Collections.shuffle(yourGameList)'',然後它是隨機的。 – skiwi

相關問題