2013-12-07 4 views
2

Для данного Collection<Object> aCollection Как построить ArrayList<OrderedCouple<Object>> со всеми возможными перестановками пар в aCollection (кроме самообучения).Наиболее эффективный способ построения списка случайных перестановок

Например, скажем, aCollection является Set<Team> содержащим teamA, teamB и teamC и OrderedCouple вместо этого класса Game<Team> которого конструктор получает две команды, хозяин и гость в качестве аргументов. Я хочу построить ArrayList из всех возможных Game между Team 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: ((почему у canant standard API есть этот материал. – arynaq

+0

@arynaq - haha ​​:) – Elist

+0

Я думаю, что библиотека Guava может помочь вам получить что-то довольно легко с помощью Collections2. http://docs.guava-libraries.googlecode.com/git/javadoc/COM/Google/общий/пособ 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)'. Но для небольших команд и небольшого количества заданных чисел (в этом случае две команды), все будет хорошо. – skiwi

+1

@Elist Используйте этот код, а затем создайте «Список» объектов 'Game', а затем вызовите' Collections.shuffle (yourGameList); ', тогда он случайный. – skiwi