From: Glenn Date: 2008-10-01T07:30:04+09:00 Subject: Re: Mode method for Array --0-1364420513-1222813867=:73318 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Hi,=0A=0AI wrote 2 ways. I don't know if either way is good or not. Any f= eedback is welcome.=0A=0AThe first way makes a hash of the array, with the = unique values in the array as the keys, and the number of times the keys oc= cur as the values. Then I create a new hash out of that first hash with th= e frequencies as the keys of the hash and the elements that had that freque= ncy as the values. Then I pick out the value of the highest key.=0A=0AThe = second way creates that frequency hash, then iterates over the hash and cre= ates an array with the elements that have the highest frequency.=0A=0A clas= s Array =0A def hash_of_frequency=0A h =3D Hash.new(0)=0A each_with= _index do |e, i|=0A e =3D e.to_f if e !=3D nil=0A h[e] =3D h[e] += =3D 1 =0A end=0A h=0A end=0A=0A def get_mode=0A h =3D hash_of_fr= equency.frequency_in_key=0A h[h.keys.max].sort=0A end=0Aend=0A=0Aclass = Hash=0A def frequency_in_key=0A h =3D Hash.new { |k, v| k[v] =3D [] }= =0A each { |k, v| h[v] << k if k !=3D nil }=0A h=0A end=0A=0A def g= et_mode=0A a =3D []=0A max_value =3D values.max=0A each { |k, v| a= << k if v =3D=3D max_value }=0A a=0A end=0Aend=0A=0A=0A[3, 1, 1, 55, 5= 5].hash_of_frequency.get_mode.inspect ## returns [1.0, 55.0]=0A[3, 1, 1, 55= , 55].get_mode.inspect ## returns[1.0, 55.0]=0A=0A=0A=0A----- Original Mess= age ----=0AFrom: Eust=E1quio 'TaQ' Rangel =0ATo:= ruby-talk ML =0ASent: Tuesday, September 30, 2008= 6:14:35 PM=0ASubject: Re: Mode method for Array=0A=0A> I'd like to write a= get_mode method for the Array class. The method would return an array of = the most frequently occurring element or elements.=0A> So [3, 1, 1, 55, 55]= .get_mode would return [1, 55].=0A> I have a way to do this but I don't kno= w if it's the best way. I was wondering if anyone had any suggestions?=0A= =0AWhat is your way? Maybe we can have some idea of what parameters you are= using=0Ato the the most frequently elements. Using something like=0A=0Airb= (main):001:0> [3,1,1,55,55].inject(Hash.new(0)){|memo,item| memo[item] +=3D= 1;=0Amemo}.sort_by {|e| e[1]}.reverse=0A=3D> [[55, 2], [1, 2], [3, 1]]=0A= =0Acan return you some elements ordered by frequency. --0-1364420513-1222813867=:73318--