Edited at

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]