【问题标题】:Ruby array - returning a collection of duplicate and non-duplicate objectsRuby 数组 - 返回重复和非重复对象的集合
【发布时间】:2011-07-30 17:43:32
【问题描述】:

我有一组具有以下属性的 Race 对象:

  • 方式
  • race_period_id
  • track_id

我想将那些 Race 对象——其中 way 和 track_id 属性值相同——收集到一个名为复数数组的新数组中。 (基本上,每个重复的 Race 对象都由 way 和 track_id 定义。)在另一个名为singular_array 的数组中,我想收集所有不重复的 Race 对象。

例如,假设我有四个具有以下属性值的 Race 对象:

比赛1:

  • 方式 = 1
  • race_period_id = 20304
  • track_id = 94949

比赛2:

  • 方式 = 2
  • race_period_id = 20888
  • track_id = 94949

比赛3

  • 方式 = 1
  • race_period_id = 20899
  • track_id = 94949

比赛4

  • 方式 = 1
  • race_period_id = 20888
  • track_id = 885858

所以这里我有两个“复数”对象:race 1 和race3。还有两个“奇异”对象:race2 和 race4。

如果我有一个名为 get_plural_and_singular_arrays(races_array) 的方法,我会使用什么算法来返回一个 plural_array(仅包含对象 race 1 和 race3)和一个 singular_array(仅包含对象race2 和race4)?

def get_plural_and_singular_arrays(races_array)
  # algorithm here

  return plural_array, singular_array
end

【问题讨论】:

    标签: ruby arrays algorithm logic


    【解决方案1】:

    您可以先使用group_by,然后将其结果组织成单打和双打:

    list.group_by do |i|
      [ i.way, i.track_id ]
    end.values.group_by do |list|
      list.length > 1
    end
    

    您应该分别为您的多个条目和单个条目使用带有键 truefalse 的哈希。

    【讨论】:

    • +1 是一个不错的功能解决方案。不过,我会使用分区:list.group_by { |r| [r.way, r.track_id] }.partition { |ary| ary.size > 1 }
    • 顺便说一句我的单线(ActiveSupport 数组增强):list.group_by { |i| [i.way, i.track_id] }.partition(&:many?)
    • 巧妙的把戏……我试过了……起初,觉得它可能有点太“可爱”,但效果很好
    【解决方案2】:

    代码:

    def get_plural_and_singular_arrays(races_array)
      singular_array, plural_array = [], []
      # algorithm here 
      races_array.group_by { |race| [race.way, race.track_id] }.each do |key, values|
        if values.size == 1
          singular_array << values[0]
        else
          plural_array += values
        end
      end
      return plural_array, singular_array
    end
    

    测试:

    irb(main):025:0> Race = Struct.new(:way, :track_id)
    => Race
    irb(main):026:0> r1 = Race.new(1, 2)
    => #<struct Race way=1, track_id=2>
    irb(main):027:0> r2 = Race.new(1, 2)
    => #<struct Race way=1, track_id=2>
    irb(main):028:0> r3 = Race.new(3, 4)
    => #<struct Race way=3, track_id=4>
    irb(main):029:0> r4 = Race.new(3, 5)
    => #<struct Race way=3, track_id=5>
    irb(main):030:0> get_plural_and_singular_arrays([r1, r2, r3, r4])
    => [[#<struct Race way=1, track_id=2>, #<struct Race way=1, track_id=2>], [#<str
    uct Race way=3, track_id=4>, #<struct Race way=3, track_id=5>]]
    irb(main):031:0>
    

    【讨论】:

      【解决方案3】:

      这可能有效:

      def get_plural_and_singular(races)
        grouped_races = races.group_by { |r| [r.way, r.track_id] }.values
        grouped_races.partition { |grp| grp.size > 1 }.map(&:flatten)
      end
      

      【讨论】:

        猜你喜欢
        • 2020-07-27
        • 2016-04-25
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 2017-04-02
        • 2015-05-30
        • 1970-01-01
        • 2020-10-31
        相关资源
        最近更新 更多