2011-07-30 4 views
1

나는 다음과 같은 속성을 가진 인종 객체의 배열을 가지고 plural_array라는 새 배열에서 way 및 track_id 특성 값이 동일한 레이스 개체를 수집하려고합니다. (기본적으로 way와 track_id에 의해 정의 된 각각의 Race 객체를 복제합니다.) singular_array라는 또 다른 배열에서 중복되지 않는 모든 Race 객체를 수집하려고합니다.루비 배열 중복 및 비 중복 된 개체의 컬렉션을 반환

race1 :

  • 방법 = 1
  • race_period_id = 20304
  • track_id = 94949
  • 예를 들어

    , 이제 나는 다음과 같은 속성 값을 가진 네 레이스 객체가 있다고 가정하자

race2 :

  • 방법 = 2
  • race_period_id = 20,888
  • track_id = 94,949

race3

  • 방식 = 1
  • race_period_id = 20,899
  • track_id = 94,949
01 23,516,

race4

  • 방법 = 1
  • race_period_id = 20888
  • track_id = 그래서 여기 885,858

I이 "복수"개체가 : 인종 1 race3을. 그리고 두 개의 "단수"객체 인 race2와 race4.

내가 가진 경우라는 방법 get_plural_and_singular_arrays (races_array), 내가 반환하는 데 사용하는 것이 무엇 알고리듬 plural_array (포함 개체 만 인종 1 race3)과 singular_array (포함은 race2 및 race4 객체) ?

def get_plural_and_singular_arrays(races_array) 
    # algorithm here 

    return plural_array, singular_array 
end 

답변

2
당신은 group_by를 사용하고 단식과 복식에 그 결과를 정리하여 시작 할 수

: 당신은 당신의 여러 항목 및 단일 항목에 대한 키 truefalse와 해시를해야

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

각기.

+1

일을 멋진 기능 솔루션. 그래도 파티션을 사용합니다 : list.group_by {| r | [r.way, r.track_id]}. 파티션 {| ary | ary.size> 1} – tokland

+0

+1 한 줄로 작성할 수있는 코드! –

+0

내 one-liner를 Btw ('ActiveSupport' 배열 개선) :'list.group_by {| i | [0123] . –

0

코드 :

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> 
0

이 작동 될 수 있습니다

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