我有两个数组,每个数组包含任意数量的具有相同键但值不同的哈希值:
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。
我无法理解这个问题。
答案 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
方法可能会有用。您想要实际值本身,而不是包含哈希值,这样我们就可以获得一些灵活性。熟悉函数式编程风格有助于此。在我看来,我可以看到select
,map
和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
答案 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