最近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]