找到具有公共密钥的哈希数组的最大值?

我有两个数组,每个数组包含任意数量的具有相同键但具有不同值的哈希:

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将是4.具有:type 1的散列的最大:value_length将是8。

我无法理解这个问题。

一个简单的方法:

 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} 

我不完全确定我知道你想要的输出是什么,但试试这个。 我假设数组是有序的,以便ArrayA[x][:type] == ArrayB[x][:type]并且你正在寻找(ArrayA[x], ArrayB[x])之间的最大值而不是整个数组。 如果不是这种情况,那么首先连接两个arrays的其他解决方案将会很有效。

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

这是我接近它的方式:你正在寻找最大值的东西,所以Array#max方法可能会有用。 您想要实际值本身,而不是包含哈希值,这样我们就可以获得一些灵活性。 熟悉函数式编程风格有助于此。 在我看来,我可以看到selectmapmax如何组合在一起。 这是我的解决方案,如指定的那样,返回数字本身,最大值:

 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 

您也可以按类型过滤后排序。 这样你就可以获得最小,第二大等。

 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