2010-07-03 3 views
0

Предположим, у меня есть массив, называемый teams.
Я хочу запланировать matches за каждые team со всеми остальными team.Элементы парных элементов в рубине

Это почти то, что я хочу, за исключением того же matches добавляются дважды:

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 

Как сделать это?

ответ

2

проверить, работает ли он

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 

Пример

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

Это делает работу. Однако я надеялся на лучшее решение. :) –

+1

Оператор if ничего не делает, i - это int, и вы сравниваете его с именем команды, которое является строкой. Но да, кроме этого, это лучшее решение. –

+1

@Joshua: - oohhhhhhhhh да, я думаю, это должны быть команды [i]! = Teams.last. Я думаю, что это будет работать без условия. Ночек. – Salil

0

В вашем классе Match, при условии, внутренние атрибуты red и blue

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

и петля:

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 

Объяснение:

include? функция Array использует == методы, так что вы просто должны переопределить его и придавая ему поведение, которое вы хотите для вашего Матчи.

+0

Это выглядит немного лучше для меня, чем решение Salil. :) –

+0

@Arnis L: - производительность мудрая будет итерации 16 раз для массива длиной 4, где моя итерации всего 7 раз. – Salil

+0

@Salil ty для этого наконечника. Однако производительность не является проблемой. –

8

В Ruby 1.8.7+ вы можете использовать Array#combination:

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

В 1.8.6, вы можете использовать Facets сделать то же самое:

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

Если бы я знал, как установить ruby ​​1.8.7+ на моем fedora13 :) –

Смежные вопросы