最近Rubyのアルゴリズム問題をよくといているので、メモ用に残しておきたいと思います。
もっと良いやり方あるぞ!他にも良い使い方あるぞって方がいたらぜひ教えて欲しいです!!
#配列
##ターミナルから文字を入力し、配列を作成
ary = gets.split
#=> ターミナルでa b cと入力
p ary #=> ["a", "b", "c"]
###split
これを書くことにより、スペースを区切り文字として扱ってくれている。また,先頭・末尾の空白文字列を取り除きます。
(この空白文字は改行も含みます)
split == split(" ")の挙動をしてくれている
1引数に正規表現を渡すことで、そのパターンにマッチした文字列で区切ったり、第2引数に分割制限の値を渡すことで、分割個数を制限することができます
ary = "aaa"
p ary.split("")
#=> ["a","a","a"] 1文字ごとに区切る
ary = "aaaaa"
p ary.split("", 3 )
#=> ["a", "a", "aaa"] 第2引数で個数を3個に制限
##配列の中にある要素の使い方
###要素の出し入れ
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"] #上書きされない
###配列の数、要素の長さ
ary = ["aaaaa","aa","aaa"]
p ary.length
#=> 3 #配列の要素数
p ary[0].length
#=> 5 #配列の一番目にある文字の長さ
###要素の特定、検索、場所
#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
#多次元配列
##多次元配列の作り方
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"]]
#第二引数に要素を指定できる
##要素の追加
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メソッドを使って別々のオブジェクトとして初期化
ary = Array.new(3, Array.new(3, "a") )
p ary.map(&:object_id) #idを調べる
#=>[70167967248120, 70167967248120, 70167967248120]
同じobject_idが出るためmapで別々のオブジェクトに作り変える
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]