配列の生成
同じ値で埋める
1 2 3 |
p Array.new(10, 0) # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] |
連番の配列
1 2 3 |
p (0..9).to_a # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
数列の配列
1 2 3 |
p (0..9).to_a.map { |e| e * 2 } # 0, 2, 4, 6, 8, 10, 12, 14, 16, 18] |
乱数の配列
1 2 3 |
p Array.new(10).map { |e| rand(0..9)} # [6, 2, 2, 8, 8, 2, 3, 4, 1, 2] |
ハッシュから配列への変換
キーや値の配列を取り出す
1 2 3 4 5 |
p h.keys p h.values # [:one, :two, :three] # [1, 2, 3] |
シンボルの配列を文字列の配列に変換するにはto_s
、その逆の変換はto_sym
を要素にマップする。
1 2 3 4 5 |
p s = h.keys.map { |e| e.to_s } p s.map { |e| e.to_sym } # ["one", "two", "three"] # [:one, :two, :three] |
[キー, 値]
を要素とする配列に変換
1 2 3 |
p h.to_a # [[:one, 1], [:two, 2], [:three, 3]] |
[[キー, ...], [値, ...]]
の配列に変換
1 2 3 4 |
p h.to_a p h.to_a.transpose # [[:one, :two, :three], [1, 2, 3]] |
配列からハッシュへの変換
基本の生成方法
1 2 3 |
p Hash["one", 1, "two", 2, "three", 3] # {"one"=>1, "two"=>2, "three"=>3} |
ただし配列をそのまま適用するとエラー。
1 2 3 4 5 6 7 |
a = ["one", 1, "two", 2, "three", 3] p Hash[a] # array_and_hash.rb:31: warning: wrong element type String at 0 (expected array) # array_and_hash.rb:31: warning: ignoring wrong elements is deprecated, remove them explicitly # array_and_hash.rb:31: warning: this causes ArgumentError in the next release # ...が6回 |
なので以下を利用する。
1 2 3 4 5 6 7 8 9 |
a = ["one", 1, "two", 2, "three", 3] p *a # "one" # 1 # "two" # 2 # "three" # 3 |
フラットな配列からハッシュへ
*
を利用して展開
1 2 3 4 |
a = ["one", 1, "two", 2, "three", 3] p Hash[*a] # {"one"=>1, "two"=>2, "three"=>3} |
[[キー, 値], ...]
の配列から変換
フラットな配列に変換してからハッシュへ。
1 2 3 4 |
a = [["one", 1], ["two", 2], ["three", 3]] p Hash[*a.flatten] # {"one"=>1, "two"=>2, "three"=>3} |
[[キー, ...], [値, ...]]
の配列から変換
transpose
で[[キー, 値], ...]
の形にしてからフラットな配列に変換して展開。
1 2 3 4 |
a = [["one", "two", "three"], [1, 2, 3]] p Hash[*a.transpose.flatten] # {"one"=>1, "two"=>2, "three"=>3} |
キー配列と値の配列から変換
[キー配列, 値配列]からtranspose→flatten→展開。
1 2 3 4 5 |
keys = ["one", "two", "three"] values = [1, 2, 3] p Hash[*[keys, values].transpose.flatten] # {"one"=>1, "two"=>2, "three"=>3} |
to_h
を使う方法
[[キー, 値], ...]
の配列ならHash[*a.flatten]
とせずにa.to_h
が使える。上のそれぞれの配列についてto_h
を使うと以下のようになる。
1 2 3 4 5 |
p [["one", 1], ["two", 2], ["three", 3]].to_h keys = ["one", "two", "three"] values = [1, 2, 3] p [keys, values].transpose.to_h |
補足~シンボルと文字列の変換
シンボルと文字列の配列はto_s、to_symで相互変換可能。
1 2 3 4 5 6 7 8 9 |
sym = [:one, :two, :three] p sym.map { |e| e.to_s } # ["one", "two", "three"] str = ["one", "two", "three"] p str.map { |e| e.to_sym } # [:one, :two, :three] |