2010-07-03 7 views
0

Disons que j'ai un tableau appelé teams.
Je veux planifier matches pour chaque team avec tous les autres team.Associer des éléments de tableau à ruby ​​

Ceci est presque ce que je veux, sauf que même matches sont ajoutés deux fois:

teams.each do |red_team| 
    teams.each do |blue_team| 
    if red_team != blue_team 
     @planned_matches << Match.new(red_team, blue_team) 
    end 
    end 
end 

Comment faire cela?

Répondre

2

vérifier si cela fonctionne

for i in 0..teams.length-1 
    if i != teams.last 
    for j in (i+1)..teams.length-1 
     @planned_matches << Match.new(teams[i], teams[j]) 
    end 
    end 
end 

EXEMPLE

teams = ['GERMANY', 'NETHERLAND', 'PARAGUAY', 'ARGENTINA'] 
for i in 0..teams.length-1 
    if i != teams.last 
    for j in (i+1)..teams.length-1 
     puts " #{teams[i]} Vs #{teams[j]}" 
    end 
    end 
end 

O/P

GERMANY Vs NETHERLAND 
GERMANY Vs PARAGUAY 
GERMANY Vs ARGENTINA 
NETHERLAND Vs PARAGUAY 
NETHERLAND Vs ARGENTINA 
PARAGUAY Vs ARGENTINA 
+0

Il fonctionne. J'espérais cependant une meilleure solution. :) –

+1

L'instruction if ne fait rien, je suis un int et vous le comparez à un nom d'équipe qui est une chaîne. Mais oui, à part ça, c'est la meilleure solution. –

+1

@Joshua: - oohhhhhhhhh oui je pense que ça devrait être équipes [i]! = Teams.last. Je pense que cela fonctionnera sans condition. non, cependant. – Salil

0

Dans votre classe Match, en supposant les attributs internes sont red et blue

class Match 
#... 
    def ==(anOther) 
    red == anOther.blue and anOther.red == blue 
    end 
#... 
end 

et la boucle:

teams.each do |red_team| 
    teams.each do |blue_team| 
    if red_team != blue_team 
     new_match = Match.new(red_team, blue_team) 
     planned_matches << new_match if !planned_matches.include?(new_match) 
    end 
    end 
end 

Explication:

La fonction include? de Array utilise les méthodes ==, il vous suffit de passer outre et de lui donner le comportement que vous voulez pour votre Allumettes.

+0

Cela me semble un peu mieux que la solution de Salil. :) –

+0

@Arnis L: - performance sage itera 16 fois pour un tableau de longueur 4 où le mien est itéré pour seulement 7 fois. – Salil

+0

@Salil ty pour cette astuce. La performance n'est pas un problème cependant. –

8

Dans Ruby 1.8.7+, vous pouvez utiliser Array#combination:

teams = %w(A B C D) 
matches = teams.combination(2).to_a 

En 1.8.6, vous pouvez utiliser Facets faire la même chose:

require 'facets/array/combination' 
# Same code as above. 
+0

Si seulement je savais comment installer ruby ​​1.8.7+ sur mon fedora13 :) –

Questions connexes