Rubyのまとめ3(配列からハッシュDate,Timeまで)

2から続く

配列(Array)

複数のデータをまとめて格納できるオブジェクトのこと

配列内のデータ(要素)は順番に並んでいて添字(インデックス)
を指定することでデータを取り出せる

配列の作成

空の配列を作る[]

3つの要素が格納された配列を作る
[要素1,要素2,要素3]

arr = []
=> []
arr
=> []

a = [1, 2, 3, 'aa', [1, 2, 3]]
=> [1, 2, 3, "aa", [1, 2, 3]]
2.5.1 :006 > a[0]
=> 1
2.5.1 :007 > a[1]
=> 2
2.5.1 :008 > puts a
1
2
3
aa
1
2
3
=> nil

小文字のwはシングルクォートとおなじで
%w(a b)
=> ["a", "b"]
大文字のWはダブルクォートとおなじで式展開できる
a = 1
=> 1
b = 2
=> 2

%W(あ#{a} い#{b})
=> ["あ1", "い2"]

シンボルに変換もできる
%i[ a b c ]
=> [:a, :b, :c]

繰り返し処理をする時
%w[a b c].each do |abc|
   puts abc
 end 
a
b
c
=> ["a", "b", "c"]

breakは指定したものまで繰り返す
%w[a b c].each do |abc|
   break if abc == 'c'
   puts abc
 end 
a
b
=> nil

nextは指定したものをスキップする
%w[a b c].each do |abc|
    next if abc == 'b' 
      puts abc 
    end 
a
c
=> ["a", "b", "c"]

mapを使って配列内に()を付加
%w[a b c].map { |abc| "(#{abc})" }
=> ["(a)", "(b)", "(c)"]

aは空か?(.empty)

a.empty?
=> false
2.5.1 :010 > b = []
=> []
2.5.1 :011 > b.empty?
=> true

変数aに’aa’はふくまれている?(.include)

2.5.1 :012 > a.include?('aa')
=> true
2.5.1 :013 > a.include?('b')
=> false
a = [[1, 2, 3], "aa", 3, 2, 1]
2.5.1 :014 > a.reverse
=> [[1, 2, 3], "aa", 3, 2, 1]
2.5.1 :015 > a
=> [1, 2, 3, "aa", [1, 2, 3]]
2.5.1 :016 > a.reverse!
=> [[1, 2, 3], "aa", 3, 2, 1]
2.5.1 :017 > a
=> [[1, 2, 3], "aa", 3, 2, 1]

配列をランダムにする(.shuffle)

2.5.1 :018 > a.shuffle
=> [3, 2, "aa", 1, [1, 2, 3]]

(0..25).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
2.5.1 :026 > (0..99).to_a.shuffle!
=> [96, 92, 23, 49, 27, 60, 20, 72, 8,
50, 70, 64, 41, 75, 88, 26, 82, 14, 6,
78, 10, 55, 74, 48, 17, 52, 24, 16, 95,
63, 36, 19, 91, 93, 57, 85, 56, 67, 2,
15, 89, 44, 31, 43, 98, 3, 38, 28, 12,
86, 35, 65, 83, 94, 47, 0, 81, 4, 62,
77, 84, 13, 90, 33, 45, 21, 99, 39, 22,
71, 46, 61, 66, 87, 25, 30, 29, 34, 51,
73, 68, 18, 69, 37, 80, 11, 7, 9, 58, 5,
53, 42, 1, 40, 79, 59, 32, 54, 76, 97]

配列に新しく入れる(.push)(<<)

z = (0..10).to_a

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

2.5.1 :028 > z << 20

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

2.5.1 :029 > z

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

2.5.1 :030 > z.push(30)

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]

2.5.1 :031 > z

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]

配列の最後を取り出す(.pop)

2.5.1 :032 > z.pop
=> 30
2.5.1 :033 > z
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

最初の配列を取り出す(.shift)

z.shift
=> 0
z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

2.5.1 :038 > z << 3

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3]

2.5.1 :039 > z << 6

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3, 6]

重複したものがなくなり一つにまとまる(.uniq)

2.5.1 :040 > z.uniq
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
2.5.1 :041 > z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3, 6]
2.5.1 :042 > z.uniq!
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
2.5.1 :043 > z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

配列の文字列を結合する(.join)並び替える(.sort)

s = ['my' 'name' 'is' 'suzutuki']

s

=> ["my", "name", "is", "suzutuki"]

2.5.1 :048 > s.join

=> "mynameissuzutuki"

2.5.1 :049 > s.join(' ')

=> "my name is suzutuki"

2.5.1 :050 > s.join('_')

=> "my_name_is_suzutuki"

s.sort.reverse

=> ["suzutuki", "name", "my", "is"]

2.5.1 :053 > s.sort.reverse!

=> ["suzutuki", "name", "my", "is"]

2.5.1 :054 > s

=> ["my", "name", "is", "suzutuki"]
↓配列の数がわかる
s.size
=> 4

シンボル

ソースコード上では文字列のように見えるが内部では整数として扱われる。

シンボルを使った形の方が文字列をきれいに使う場合に比べて、ハッシュのアクセスは速いとされる

オブジェクトIDを確認すると、String オブジェクト で は 同じ 文字列であっても別のオブジェクトが生成されるのに対してシンボルでは同じシンボル名であれば同一のシンボルを指している。

ハッシュとは?

キー(key)と値(Value)の組み合わせでデータを管理するオブジェクト

連想配列、ディクショナリー、マップと言う場合も

ハッシュの作成

空のハッシュを作成{}(中かっこと読む)

キーと値の組み合わせを3つ格納するハッシュを作成

{キー1 => 値1, キー2 => 値2, キー3 => 値3 }

suzutuki = {'name' => 'suzutuki', 'birthplace' => 'Gihu'}

=> {"name"=>"suzutuki", "birthplace"=>"Gihu"}

2.5.1 :058 > puts suzutuki['name']

suzutuki
=> nil

2.5.1 :059 > puts suzutuki['birthplace']

Gihu
=> nil

2.5.1 :060 > suzutuki['age'] = 18
=> 18

2.5.1 :061 > puts suzutuki
{"name"=>"suzutuki", "birthplace"=>"Gihu", "age"=>18}
=> nil

↓ageを20に変更したいとき
suzutuki['age'] = 20
=> 20

2.5.1 :063 > puts suzutuki
{"name"=>"suzutuki", "birthplace"=>"Gihu", "age"=>20}
=> nil

suzutuki.delete('age')
=> 20

puts suzutuki
{"name"=>"suzutuki", "birthplace"=>"Gihu"}
=> nil
ota = {name: 'ota', birthplace: 'tokyo'}
=> {:name=>"ota", :birthplace=>"tokyo"}
2.5.1 :067 > puts ota[:name]
ota
=> nil
2.5.1 :068 > ota[:age] = 20
=> 20
2.5.1 :070 > ota[:age] = 21
=> 21
2.5.1 :072 > puts ota
{:name=>"ota", :birthplace=>"tokyo", :age=>21}
=> nil
2.5.1 :073 > ota.delete(:age)
=> 21
puts ota
{:name=>"ota", :birthplace=>"tokyo"}
=> nil

キーの確認.keys

ota.keys
=> [:name, :birthplace]

値の確認.values

2.5.1 :075 > ota.values
=> ["ota", "tokyo"]
2.5.1 :076 > ota.has_key?(:name)
=> true
2.5.1 :077 > ota.has_key?(:address)
=> false
2.5.1 :078 > ota.size
=> 2

Time,Dateオブジェクト

 Time.now
=> 2021-010-02 12:06:55 +0900
[6] pry(main)> Time.now.zone
=> "JST"
[7] pry(main)> datetime = Time.new(2021, 10, 2, 12, 45)
=> 2021-01-02 12:45:00 +0900
[8] pry(main)> datetime.strftime('%Y年 %m月 %d日 %H時 %M分')
=> "2021年 10月 02日 12時 45分"

いきなりDateクラスは使えない
[9] pry(main)> Date
NameError: uninitialized constant Date
Did you mean? Data
from (pry):12:in `__pry__'
requireをすることで使えるようになる
[10] pry(main)> require 'date'
=> true
[11] pry(main)> Date
=> Date
Date.today
=> #<Date: 2021-01-02 ((2459317j,0s,0n),+0s,2299161j)>
[15] pry(main)> Date.new(2021, 10, 2)
=> #<Date: 2021-01-02 ((2459217j,0s,0n),+0s,2299161j)>

[17] pry(main)> Date.new(2021, 10, 2).strftime('%Y年 %m月 %d日 %H時 %M分')
=> "2021年 10月 02日 00時 00分"

4に続く

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です