30代でジョブチェンジ

30代中盤、社会人経験約10年の男性です。転職をしてすぐに退職勧奨を受けて無職をしながらIT関連の学習をしていました。現在は業界で就労中です。

楽しいRuby 第4版 Arrayクラス

楽しいRubyで残しときたいメモが以外に多いので分ける。
わかったことと練習問題の回答を記す。
練習問題はできる限り自信の回答を記すが、うまく行かない場合、
回答を貼ることもあります。ネタバレ注意
今回は多分自分だけではないはず、初心者大好きArrayクラス

集合としての配列

&

共通集合 2つのarrayの中から同じ要素をピックアップする。

|

和集合 2つのarrayをくっつける。+でくっつけると全要素が全てくっつく。

num = [1, 2, 3]
even = [2, 4, 6]
p (num + even) # => [1, 2, 3, 2, 4, 6]
p (num | even) # => [1, 2, 3, 4, 6]

列としての配列

キュー

FIFO 待ち行列 1入れる 2取り出す 最初に入れたものを最初に取り出す
メソッド push 配列の一番後ろに入れる
メソッド shift 先頭の要素を取り除く

スタック

LIFO 1入れる 2取り出す 最後に入れたものを最初に取り出す
メソッド push 配列の一番後ろに入れる
メソッド  pop 末尾の要素を取り除く

先頭要素に対する操作 末尾要素に対する操作
要素を加える unshift push
要素を取り除く shift pop
要素を参照する first last

配列の主なメソッド

配列から要素を取り除く

compact

配列の中のnilを取り除く。

delete(x)

配列からxの要素、特定の要素を取り除く 値指定

delete_at(n)

配列a[n]の要素を取り除く 配列指定

delete_if{ブロック}, reject{ブロック}

ブロックを実行した結果が真なら配列から要素を取り除く

a = [1, 2, 3, 4, 5]
a.delete_if{|i| i > 3}
p a # => [1, 2, 3]

delete_if、reject!は破壊的メソッド

練習問題

1から100までの配列を作る
a = [] # 配列を作る
for i in 1..100
a << i #数字を入れていく
end

これはできた。

さっき作った配列の要素を100倍する。元の配列を破壊する
a.map!{
|i| i * 100
}

これもできた。

最初にできた配列から3の倍数だけにした新しい配列を作る
a.reject!{|i|
i % 3 != 0
}

これもなんとかできた。

最初にできた配列を逆順に並べる
a.reverse!

これはできた。

最初の配列に含まれる整数の和を求める
s = a.inject(:+)
p s

これもできた。これはおそらく、イテレーターを使って足していくんだろうけど、
injectメソッドを使った。

最初に作った配列から10個ずつを1つの配列として、新しい配列の中に格納していく。
result = Array.new
10.times do |i|
    result << a.slice!(0, 10) #aの配列のインデックス0から10個の配列を抜き出し、resultに格納していく。
end
p result

これは本を読まないとわからなかった。slice!を使うことはなんとなく把握できたが引数の指定の仕方がわからなかった。

以下の結果を返すsum_arrayメソッドを定義する
p sum_array([1, 2, 3], [4, 6, 8]) #=> [5, 8, 7]
def sum_array(x, y)
    a = []
    s = x.zip(y)
    s.each do |i|
        a << i[0] + i[1]
    end
    p a
end
sum_array([1, 2, 3], [4, 6, 8])

これより絶対良い簡単なメソッドがあるはず。。。

配列は素人目には理解しやすいしメソッドが楽しいけど、
実際プログラミングで使うと奥が深すぎるんじゃないかと思う。