2016-09-14 3 views
2

これは、入力として、サンプルアレイの例である:ソートアレイと、複数の条件でそれを一意にする - ルビー

hashForAnimals = [{ 
    :animalCd=>"Tiger",:animalType=>"Carnivore", :sortOrder =>3}, 
    {:animalCd=>"Cow",:animalType=>"Herbivore", :sortOrder =>5}, 
    {:animalCd=>"Rabbit", :animalType=>"Herbivore", :sortOrder =>2}, 
    {:animalCd=>"Shark",:animalType=>"Carnivore", :sortOrder =>4}, 
    {:animalCd=>"Cow",:animalType=>"Carnivore", :sortOrder =>1}, 
    {:animalCd=>"Bear", :animalType=>"Omnivore", :sortOrder =>7}, 
    {:animalCd=>"Tiger",:animalType=>"Carnivore", :sortOrder =>6}] 

予想される出力:

hashForAnimals = [{ 
    :animalCd=>"Cow", :animalType=>"Carnivore", :sortOrder =>1}, 
    {:animalCd=>"Rabbit", :animalType=>"Herbivore", :sortOrder =>2}, 
    {:animalCd=>"Tiger",:animalType=>"Carnivore", :sortOrder =>3}, 
    {:animalCd=>"Shark",:animalType=>"Carnivore", :sortOrder =>4}, 
    :animalCd=>"Cow", :animalType=>"Herbivore", :sortOrder =>5} 
    {:animalCd=>"Bear", :animalType=>"Omnivore", :sortOrder =>7}] 

私は基づいて配列をソートする必要があります並べ替えの順序と私は同じグループの下に落ちるanimalCdに関連して配列をユニークにする必要があります。

Tigerは最小ソート順で1回出現しましたが、Cowは配列に2回出現しますが、異なるanimalTypeを使用しています。

複数のanimalType配列に配列を集めてソートし、それらを一意にして単一の配列にマージすることで、これを行うことができます。しかし、私はこれのためにエレガントなソリューションが必要です。

私がしようとしているサンプルコード:

hashForAnimals.sort!{|x,y| x[:sortOrder].to_i<=>y[:sortOrder].to_i}.group_by { |a| a[:animalType]} 

に私ができる別々のハッシュにグループ化してその後私は、個々のハッシュが一意にして、配列にマージする必要があります。

これは私がそれに近づく方法でも可能ですか?

答えて

2

あなたはsort_by方法とuniqvalues_at

hashForAnimals.sort_by{ |a| a[:sortOrder] }.uniq{ |k| k.values_at(:animalCd, :animalType) } 


# => [{:animalCd=>"Cow", :animalType=>"Carnivore", :sortOrder=>1}, {:animalCd=>"Rabbit", :animalType=>"Herbivore", :sortOrder=>2}, {:animalCd=>"Tiger", :animalType=>"Carnivore", :sortOrder=>3}, {:animalCd=>"Shark", :animalType=>"Carnivore", :sortOrder=>4}, {:animalCd=>"Cow", :animalType=>"Herbivore", :sortOrder=>5}, {:animalCd=>"Bear", :animalType=>"Omnivore", :sortOrder=>7}] 
+0

[OK]を使用することができ、私はあなたの質問をmissunderstod。私は今は良いと思う –

+1

'values_at'メソッドで私の最後の更新を試しましたか? –

+0

values_at APIを認識しませんでした。鮮やかな、迅速な返信に感謝! – user122121

関連する問題