代码之家  ›  专栏  ›  技术社区  ›  Arnis Lapsa

ruby中的数组元素配对

  •  0
  • Arnis Lapsa  · 技术社区  · 14 年前

    假设我有一个数组叫做 teams .
    我想计划一下 matches team 团队 .

    这几乎就是我想要的除了那一样 比赛 添加两次:

    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 回复  |  直到 14 年前
        1
  •  2
  •   Salil    14 年前

    检查是否有效

    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
    
        2
  •  8
  •   FMc TLP    14 年前

    在Ruby1.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.
    
        3
  •  0
  •   Romain Deveaud    14 年前

    在类匹配中,假设内部属性 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 == 方法,所以您只需重写它并为它提供匹配所需的行为。