2013-10-08 7 views
6

、同じキーが、異なる値を持つハッシュの任意の数を含む各:任意の数を有するにもかかわらず共通鍵を持つハッシュの配列の最大値を見つけますか?私は2つの配列を有する

ArrayA = [{value: "abcd", value_length: 4, type: 0},{value: "abcdefgh", value_length: 8, type: 1}] 
ArrayB = [{value: "ab", value_length: 2, type: 0},{value: "abc", value_length: 3, type: 1}] 

を、ハッシュの数は常に等しくなります。

値が特定のタイプのすべてのハッシュに対して、最大の:value_lengthを見つけるにはどうすればよいですか? :type 0の持つハッシュのため:value_length最大が8

私はちょうど私の頭の周りを取得することはできませんでしょう:type 1の持つハッシュの最大:value_length 4.だろう例えば

、この問題。

答えて

12

簡単な方法:

all = ArrayA + ArrayB # Add them together if you want to search both arrays. 
all.select{|x| x[:type] == 0} 
    .max_by{|x| x[:value_length]} 

そして、あなたはそれだけで関数を作成し、再利用したい場合:

def find_max_of_my_array(arr,type) 
    arr.select{|x| x[:type] == type} 
    .max_by{|x| x[:value_length]} 
end 

p find_max_of_my_array(ArrayA, 0) # => {:value=>"abcd", :value_length=>4, :type=>0} 
+1

これは私に非常に問題を引き起こしていた。完璧なソリューション! (私はあなたがこのサイトの人々に感謝してはならないことを知っているが、これは本当に私を助けてくれました、それは簡潔で明確な答えです!) – Starkers

+0

ありがとう!私の時間をたくさん節約してください。 –

0

私は私はあなたが望む出力が何であるかを知っている全くわからないんだけど、してみてくださいこの。私はと配列の間で最大を探している配列が配列ではないと仮定します。そうでない場合、最初に2つの配列を連結する他のソリューションがうまくいくでしょう。あなたが何かの最大を探しているので、Array#max方法は、おそらく有用であろう:

filtered_by_type = ArrayA.zip(ArrayB).select{|x| x[0][:type] == type } 
filtered_by_type.map {|a| a.max_by {|x| x[:value_length] } } 
0

は、ここで私はそれに近づいた方法です。実際の値自体が必要であり、ハッシュが含まれていないので、柔軟性が得られます。機能的なプログラミングスタイルに慣れれば、ここで役立ちます。私の考えでは、selectmap、およびmaxがどのように適合しているかがわかります。

def largest_value_length(type, hashes) 
    # Taking it slowly 
    right_type_hashes = hashes.select{|h| h[:type] == type}             
    value_lengths  = right_type_hashes.map{|h| h[:value_length]}           
    maximum   = value_lengths.max                 

    # Or, in one line              
    #hashes.select{|h| h[:type] == type}.map{|h| h[:value_length]}.max          
end                          

puts largest_value_length(1, ArrayA + ArrayB)                

=> 8 
0

あなたはまた、タイプによるフィルタリングの後に並べ替えることができます。ここで指定されているように、私の解決策だ、数自体は、最大値を返します。あなたが最小、2番目に大きい等を得ることができるようにその方法。

all = ArrayA + ArrayB 

all = all.select { |element| element[:type] == 1 } 
     .sort_by { |k| k[:value_length] }.reverse 

puts all[0][:value_length] 
#8 

puts all[all.length-1][:value_length] 
#3