Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

最近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]
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away