2013-10-08 3 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 для хеша с :type от 0 будет 4. Крупнейшее :value_length для хеша с :type из 1 будет 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, 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 
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 
Смежные вопросы