2017-06-30 3 views
2

私はRuby 2.4を使用しています。私は私のモデルの数値属性の最大数を検索したい場合は、私がアレイ内で正確に2回発生するオブジェクトの属性の最大値を見つけるにはどうすればよいですか?

max_num = my_objects_arr.maximum(:numeric_attr) 

を行うことができますが、どのように私は私の値は、配列に正確に二回発生した属性の最大数を見つけるだろうか?つまり、オブジェクト配列に3つのオブジェクトがあるとしましょう。

obj1 - numeric_attr = 3 
obj2 - numeric_attr = 3 
obj3 - numeric_attr = 4 

正確に2回発生する上記の属性の最大値は「3」になります。 "4"はすべての属性の最大値ですが、配列内で1回だけ発生します。オブジェクトの場合

+0

ああ、 "numeric_attr"はフィールドの名前です。だから、オブジェクトは "numeric_attr"という名前のフィールドしか持てません。それは理にかなっていますか? –

+0

'arr.uniq.select {| e | arr.count(e)== 2} .max' –

+0

これは最悪の場合、 'O(N²)'です。 – mudasobwa

答えて

2
array = [1, 2, 3, 2, 3, 4] 

array.group_by { |e| e } # group_by(&:itself) since 2.3 
    .select { |_, v| v.count == 2 } 
    .keys 
    .max 
#⇒ 3 

と属性:

my_objects_arr.group_by { |o| o.numeric_attr } 
       .select { |_, v| v.count == 2 } 
       .keys 
       .max 

をオブジェクト自体を取得するには:あなたは、例えば、レールの計算を使用しているので

my_objects_arr.group_by { |o| o.numeric_attr } 
       .select { |_, v| v.count == 2 } 
       .max_by(&:first) 
       .last 
2

#maximumこれはnumeric_attrによってそれらをグループ化し、正確に2

SQL推定

SELECT 
    MAX(numeric_attr) 
FROM 
    [SOME TABLE] 
GROUP BY 
    numeric_attr 
HAVING 
    COUNT(numeric_attr) = 2 
+0

これは、レールのために行く方法です。 _Sidenote:_スマートフォンからの読書をもっと尊重してください。 – mudasobwa

1
arr = [1, 2, 3, 2, 3, 4] 

arr.each_with_object(Hash.new(0)) {|n,h| h[n] += 1}.select {|_,nbr| nbr == 2}.keys.max 
    #=> 3 
を持って numeric_attrを選択することにより、あなた

my_objects_arr 
    .group(:numeric_attr) 
    .having("count(numeric_attr) = 2") 
    .maximum(:numeric_attr) 

これはnumeric_attrの最大値を見つけるために働く必要があります

Hash::newの形式を使用して、ハッシュを作成します。h w iはデフォルト値の0です。つまり、hにキーkがない場合、h[k]はゼロを返します(ハッシュは変更されません)。これは、方法Hash#[]を指し、Hash#[]=と混同しないでください。

関連する問題