Сопряжение элементов массива в ruby - PullRequest
0 голосов
/ 03 июля 2010

Допустим, у меня есть массив с именем 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

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

Ответы [ 3 ]

8 голосов
/ 03 июля 2010

В Ruby 1.8.7+ вы можете использовать Array # комбинация :

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

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

require 'facets/array/combination'
# Same code as above.
2 голосов
/ 03 июля 2010

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

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 голосов
/ 03 июля 2010

В вашем классе 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 использует методы ==, поэтому вам просто нужно переопределить ее и придать ей то поведение, которое вы хотите для своих соответствий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...