2013-10-08 49 views
6

我有兩個陣列,每個陣列包含具有相同密鑰,但不同的值任意數量的哈希:用常用密鑰找出哈希數組的最大值?

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爲每個散列的價值是某種類型?

例如,對於一個哈希最大:value_length 0的:type將是4最大:value_length與1的:type散列要8

我不能左右我的頭這個問題。

回答

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

我不能完全肯定,我知道你想要的輸出是什麼,但嘗試這個。我假設陣列的排列順序是ArrayA[x][:type] == ArrayB[x][:type],並且您正在尋找最大的(ArrayA[x], ArrayB[x])而不是整個陣列。如果情況並非如此,那麼首先將兩個數組連接起來的其他解決方案將會很好。

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

以下是我走近它:你要找的最大的東西,所以Array#max方法可能是有用的。你需要實際的值本身,而不是包含的哈希值,這樣給我們一些靈活性。熟悉函數式編程風格有助於這裏。在我看來,我可以看到select,mapmax如何配合在一起。這裏是我的解決方案,如指定的那樣返回數字本身的最大值:

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

您也可以按類型過濾後進行排序。這樣你可以得到最小,第二大等。

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