2010-07-03 65 views
0

假设我有一个名为teams的数组。
我想计划每teammatches与其他所有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

它的工作。尽管如此,我希望更好的解决方案。 :) – 2010-07-03 09:19:23

+1

if语句没有做任何事情,我是一个int,你将它与一个字符串的团队名称进行比较。但是,除此之外,这是最好的解决方案。 – 2010-07-03 10:15:15

+1

@Joshua: - oohhhhhhhhh是的,我认为它应该是球队[我]!= teams.last。我认为如果条件允许,它将无效。 nocheck虽然。 – Salil 2010-07-03 12:15:25

0

在你的类匹配,假设内部属性是redblue

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 

说明:

Arrayinclude?函数使用==方法,所以你只需要覆盖它,并给它你想要的行为,你的火柴。

+0

对我来说,这比Salil的解决方案看起来好一点。 :) – 2010-07-03 09:27:05

+0

@Arnis L: - 性能明智的是它将迭代16次长度为4的数组,其中我的迭代次数只有7次。 – Salil 2010-07-03 09:40:42

+0

@Salil ty该提示。虽然性能不是问题。 – 2010-07-03 10:01:30

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

如果我只知道如何在我的fedora13上安装ruby 1.8.7+ :) – 2010-07-03 12:43:17