我目前寫了這個,用于將我的字串元素轉換為哈希 [key],其索引作為值
def char_indices(str)
array = str.split(//)
hash = array.each_with_object({}).with_index {|(el, h), i| h[el] = []<<i}
p hash
end
回傳
{"m"=>[0], "i"=>[10], "s"=>[6], "p"=>[9]}
{"c"=>[0], "l"=>[1], "a"=>[2], "s"=>[4], "r"=>[5], "o"=>[7], "m"=>[8]}
但是我需要
char_indices('mississippi') # => {"m"=>[0], "i"=>[1, 4, 7, 10], "s"=>[2, 3, 5, 6], "p"=>[8, 9]}
char_indices('classroom') # => {"c"=>[0], "l"=>[1], "a"=>[2], "s"=>[3, 4], "r"=>[5], "o"=>[6, 7], "m"=>[8]}
問題是我的值每次都被替換,我只得到最后一個值。
我如何才能像紅寶石一樣將每個重復出現的位置添加到值中。
uj5u.com熱心網友回復:
問題是h[el] = []<<i。相反,您可以使用條件賦值來確保您使用的是陣列:
def char_indices(string)
string.each_char
.with_index
.with_object({}) do |(char, index), hash|
hash[char] ||= []
hash[char] << index
end
end
uj5u.com熱心網友回復:
def char_indices(str)
str.each_char.
with_index.
with_object({}) do |(c,i),h|
(h[c] ||= []) << i
end
end
char_indices('mississippi')
#=> {"m"=>[0], "i"=>[1, 4, 7, 10], "s"=>[2, 3, 5, 6], "p"=>[8, 9]}
char_indices('classroom')
#=> {"c"=>[0], "l"=>[1], "a"=>[2], "s"=>[3, 4], "r"=>[5], "o"=>
[6, 7], "m"=>[8]}
請注意我是如何撰寫塊變數的:|(c,i),h|. 這利用了 Ruby 的陣列分解規則。另請參閱有關該主題的這篇文章。
該方法等效于以下方法。
def char_indices(str)
h = {}
str.each_char.
with_index do |c,i|
h[c] = [] unless h.key?(c)
h[c] << i
end
h
end
也可以像這樣撰寫方法:
def char_indices(str)
str.each_char.
with_index.
with_object(Hash.new { |h,k| h[k] = [] }) { |(c,i),h| h[c] << i }
end
這使用Hash::new的形式,它接受一個塊并且沒有引數。如果
h = Hash.new { |h,k| h[k] = [] }
比,可能在添加鍵之后,如果h.key?(k) #=> false,h[k] = []被執行。在這里,當
h[c] << i
遇到,如果h.key?(c) #=> false,h[c] = []被執行,之后h[c] << i被執行,導致h[c] #=> [c]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/342927.html
標籤:红宝石
