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

时间:2013-10-08 20:19:42

标签: ruby

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

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。

我无法理解这个问题。

4 个答案:

答案 0 :(得分:13)

一种简单的方法:

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 :(得分: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] } }

答案 2 :(得分:0)

以下是我接近它的方法:您正在寻找最大值的东西,因此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

答案 3 :(得分: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