Rubyの配列で使えるメソッド、二次元配列の使い方


最近Rubyのアルゴリズム問題をよくといているので、メモ用に残しておきたいと思います。

もっと良いやり方あるぞ!他にも良い使い方あるぞって方がいたらぜひ教えて欲しいです!!

配列

ターミナルから文字を入力し、配列を作成

index.rb
ary = gets.split
#=> ターミナルでa b cと入力
p ary #=> ["a", "b", "c"]

split

これを書くことにより、スペースを区切り文字として扱ってくれている。また,先頭・末尾の空白文字列を取り除きます。
(この空白文字は改行も含みます)

split == split(" ")の挙動をしてくれている

1引数に正規表現を渡すことで、そのパターンにマッチした文字列で区切ったり、第2引数に分割制限の値を渡すことで、分割個数を制限することができます

index.rb
ary = "aaa"
p ary.split("")
#=> ["a","a","a"] 1文字ごとに区切る

ary = "aaaaa"
p ary.split("", 3 )
#=> ["a", "a", "aaa"] 第2引数で個数を3個に制限

配列の中にある要素の使い方

要素の出し入れ

index.rb
ary = ["a","b","c"]
p ary[0]
#=> "a"

ary = ["a","b","c"]
ary[1] = "d"
p ary
#=> ["a", "d", "c"] #上書きされる

ary = ["a","b","c"]
ary[1,0] = "d"
p ary
#=> ["a", "d", "b", "c"] #上書きされない

配列の数、要素の長さ

index.rb
ary = ["aaaaa","aa","aaa"]
p ary.length
#=> 3 #配列の要素数

p ary[0].length
#=> 5 #配列の一番目にある文字の長さ

要素の特定、検索、場所

index.rb
#include?は要素の皆無を調べる
ary = ["a","b","c"]
p ary.include?("a")
#=>true
p ary.include?("d")
#=>false

#findは要素を探して取り出す
ary = [1,3,6,8]
p ary.find{|n| n % 3 == 0 }
#=> 3 #3で割り切れるものを一個しか返さない

p ary.find_all{|n| n % 3 == 0 }
#0> [3,6] #3で割り切れるもの全て返す

ary = ["a","ab","cc","ac","ds"]
p ary.find_all{|n| n.include?("a")}
#=>["a", "ab", "ac"] #aと含まれているものを返す

#indexは要素の位置を教えてくれる
ary = ["a","b","c"]
p ary.index("b")
#=> 1

要素を結合させる

ary = ["a","b","c"]
p ary.join
#=> "abc" #配列の中にある要素を全て結合

p ary.join(",")
#=> "a,b,c" #引数を指定するとそれを区切り文字とする

要素を順番に取り出して使う

ary = ["a","b","c"]

ary.each do |n|
  puts n
end
#=>"a","b","c"と順番に出力される

参考にしたサイト一覧
http://www.sejuku.net/blog/11843#index
http://ref.xaio.jp/ruby

多次元配列

多次元配列の作り方

index.rb
ary = Array.new(3)
p ary
#=> [nil,nil,nil] 

ary = Array.new(3, Array.new(3, "a") )
#=>[[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
#これで2次元配列ができる

ary = Array.new(3, Array.new(3, "a") )
#=>[["a", "a", "a"], ["a", "a", "a"], ["a", "a", "a"]]
#第二引数に要素を指定できる

要素の追加

index.rb
ary = Array.new(3, Array.new(3, "a") )
ary[0][0] = 1
p ary
#=> [[1, "a", "a"], [1, "a", "a"], [1, "a", "a"]]

ary = Array.new(3).map{Array.new(3,0)}
ary[0][0] = 1
p ary
#=> [[1, "a", "a"], ["a", "a", "a"], ["a", "a", "a"]]

上記の原因は全て同じオブジェクトとして認識されているため
そこでmapメソッドを使って別々のオブジェクトとして初期化

index.rb
ary = Array.new(3, Array.new(3, "a") )
p ary.map(&:object_id) #idを調べる
#=>[70167967248120, 70167967248120, 70167967248120]
同じobject_idが出るためmapで別々のオブジェクトに作り変える
index.rb
ary = Array.new(3).map{Array.new(3,0)}
p ary(&:object_id)
#=> [70190754844300, 70190754844200, 70190754844140]

下記のサイトを見ておお!ってなりました。
http://simanman.hatenablog.com/entry/2013/06/24/200306



ちなみにmap抜かしても同義になるので、そこはまだ謎です。

ary = Array.new(3){Array.new(3,0)}
p ary.map(&:object_id)
#=> [70322091142940, 70322091142840, 70322091142800]