:Ruby Array'da çoğaltmaları toplamanın en hızlı/tek bağlantı yolu?
[1, 1, 1, 1, 2, 2, 3, 5, 5, 5, 8, 13, 21, 21, 21]
böyle nesnelerin bir diziye ...: nihayet,
[{1 => 4}, {2 => 2}, {3 => 1}, {5 => 3}, {8 => 1}, {13 => 1}, {21 => 3}]
:Ruby Array'da çoğaltmaları toplamanın en hızlı/tek bağlantı yolu?
[1, 1, 1, 1, 2, 2, 3, 5, 5, 5, 8, 13, 21, 21, 21]
böyle nesnelerin bir diziye ...: nihayet,
[{1 => 4}, {2 => 2}, {3 => 1}, {5 => 3}, {8 => 1}, {13 => 1}, {21 => 3}]
istediğiniz formata uymak için, çözüme eşlemek için bir çağrı eklemek olabilir:
hala bir tek satırlık olmasına rağmenarray.inject({}) { |h,v| h[v] ||= 0; h[v] += 1; h }.map {|k, v| {k => v}}
, ortalık karışabilir başlar.
süper temel enjekte anlamak:
array.inject({}) { |h,v| h[v] ||= 0; h[v] += 1; h }
değil tamamen orada, ama neredeyse
gerektirir değiştirir söyleyen? –
Kendi sorunuza cevap vermek kesinlikle yasa dışı değildir. SO SSS bile bir soru biçiminde olduğu sürece tamam diyor. Diğer kişilerin iyi bilgileri bulmasına yardımcı olmak için – Twisol
. cevap verenin önemi yok. Endişelenmeyin, benim için cevapları olan soruları yazmak için etrafta dolaşma isteğim yok :). –
array.inject(Hash.new(0)) {|h,v| h[v] += 1; h }
Büyük bir fark değil ama yaptığım şeyle açık olmayı tercih ediyorum. Hash.new(0)
Cevabı biliyor eğer {}
ve h[v] ||= 0
orada, mükemmel. sağol Ryan. –
neden soruyorsun 1.8.7
a = [1, 1, 1, 1, 2, 2, 3, 5, 5, 5, 8, 13, 21, 21, 21]
h = {}
a.group_by {|e| e}.each {|k,v| h[k] = v.length}
p h # => {5=>3, 1=>4, 2=>2, 13=>1, 8=>1, 3=>1, 21=>3}
güzel, hepsi bu! Teşekkürler. –
Bunu, varsayılan bir değere sahip Hash kullanarak biraz temizleyebilirsiniz: 'array.inject (Hash.new (0)) {| h, v | h [v] + = 1; h} .map {| k, v | {k => v}} ' – rampion
Ve onu sıralamak için (örnekte olduğu gibi),' .sort_by {| o | o.keys [0]} 'ona. * Şimdi * bu dağınık. :) –