LoginSignup
18
20

More than 5 years have passed since last update.

Ruby便利メソッドまとめ:Array/Hash/Enumerator

Last updated at Posted at 2015-02-05

Array

nilを取り除いた配列を返す。

[1, nil, 2, nil, 3, nil].compact
 # => [1, 2, 3]

配列を連結する。

[1, 2, 3].concat([4, 5, 6])
 # => [1, 2, 3, 4, 5, 6]

concatで連結する場合:配列自身に連結する

a = [1, 2, 3]; p a.concat([4, 5, 6]); p a;
----------
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
----------

+で連結する場合:連結した結果を返す(配列自身は変更しない)

a = [1, 2, 3]; p (a + [4, 5, 6]); p a;
----------
[1, 2, 3, 4, 5, 6]
[1, 2, 3]
----------

指定した値と等しい要素を全て削除する。

a = [1, 2, 3, 2, 1]

a.delete(1)
 # => 1

p a
 # => [2, 3, 2]

条件が真になった要素を削除する。
deleteと違いdelete_ifの結果はselfを返す。

a = [0, 1, 2, 3, 4, 5]

a.delete_if{ |x| x % 2 == 0 }
 # => [1, 3, 5]

p a
 # => [1, 3, 5]

配列の中に等しい値があればtrueを返す。

['a', 'b', 'c'].include?('a')
 # => true

['a', 'b', 'c'].include?('z')
 # => false

条件に一致する最初の要素の位置を返す。

['a', 'b', 'c'].index('c')
 # => 2

['a', 'b', 'c'].index('z')
 # => nil

配列を指定した文字列で連結して返す。

['a', 'b', 'c'].join('-')
 # => "a-b-c"

配列を逆順にして返す。
reverse!の場合は破壊的に自身の配列を逆順に変更する。

['a', 'b', 'c'].reverse
 # => ["c", "b", "a"]

配列の中から指定した個数分、ランダムに抽出して返す。

['a', 'b', 'c'].sample
 # => "c"

['a', 'b', 'c'].sample(2)
 # => ["b", "a"]

条件に一致した要素を抽出する。

[1, 2, 3, 4, 5].select{ |x| x >= 3 }
 # => [3, 4, 5]

配列の要素をシャッフルして返す。

[1, 2, 3, 4, 5].shuffle
 # => [3, 5, 1, 2, 4]

指定した部分から抽出した部分配列を返す。

[1, 2, 3, 4, 5].slice(0, 3)
 # => [1, 2, 3]

[1, 2, 3, 4, 5].slice(2..4)
 # => [3, 4, 5]

要素を整列して返す。

['e', 'd', 'a', 'b', 'c'].sort
 # => ["a", "b", "c", "d", "e"]

重複を除いた配列を返す。

[2, 1, 5, 1, 3, 2, 4, 3].uniq
 # => [2, 1, 5, 3, 4]

Hash

キーと値をブロックに渡す。

{ a: 1, b: 2, c: 3 }.each{ |key, value| puts "#{key} : #{value}" }
----------
a : 1
b : 2
c : 3
----------

キーをブロックに渡す。

{ a: 1, b: 2, c: 3 }.each_key{ |key| p key }
----------
:a
:b
:c
----------

値をブロックに渡す。

{ a: 1, b: 2, c: 3 }.each_value{ |value| p value }
----------
1
2
3
----------

指定した値がハッシュのキーとして存在すればtrueを返す。

{ a: 1, b: 2, c: 3 }.has_key?(:b)
 # => true

{ a: 1, b: 2, c: 3 }.has_key?(:z)
 # => false

指定した値がハッシュの値として存在すればtrueを返す。

{ a: 1, b: 2, c: 3 }.has_value?(3)
 # => true

{ a: 1, b: 2, c: 3 }.has_value?(30)
 # => false

全てのキーを配列として返す。

{ a: 1, b: 2, c: 3 }.keys
 # => [:a, :b, :c]

全ての値を配列として返す。

{ a: 1, b: 2, c: 3 }.values
 # => [1, 2, 3]

Enumerator

['a', 'b', 'c', 'd', 'e'].each.with_index(1){ |value, index| puts "#{index} : #{value}" }
----------
1 : a
2 : b
3 : c
4 : d
5 : e
----------

全ての要素が真であればtrueを返す。

[1, 2, 3, 4, 5].all?
 # => true

[1, 2, 3, 4, 5, nil].all?
 # => false

[1, 2, 3, 4, 5].all?{ |x| x < 10 }
 # => true

[1, 2, 3, 4, 5].all?{ |x| x < 5 }
 # => false

全ての要素が偽であればtrueを返す。

[nil, false].none?
 # => true

[1, 2, 3, 4, 5].none?{ |x| x < 0 }
 # => true

1つでも真があればtrueを返す。

[1, 2, 3, 4, 5].any?{ |x| x >= 5 }
 # => true

[1, 2, 3, 4, 5].any?{ |x| x > 5 }
 # => false
[1, 2, 3, 4, 5].one?{ |x| x == 4 }
 # => true

[1, 2, 3, 4, 5].one?{ |x| x <= 4 }
 # => false

要素数を返す。

[1, 2, 3, 4, 5].count
 # => 5

指定した個数で区切りブロックに渡す。

[1, 2, 3, 4, 5].each_slice(2){ |x| p x }
----------
[1, 2]
[3, 4]
[5]
----------

指定した個数で区切り、1要素ずつズラしながらブロックに渡す。

[1, 2, 3, 4, 5].each_cons(2){ |x| p x }
----------
[1, 2]
[2, 3]
[3, 4]
[4, 5]
----------

条件に一致する値と条件に一致しない値をそれぞれ別々の配列に振り分ける。

(1..10).partition{ |x| x % 3 == 0 }
 # => [[3, 6, 9], [1, 2, 4, 5, 7, 8, 10]]

指定した個数分、先頭から抽出する。

[1, 2, 3, 4, 5].take(3)
 # => [1, 2, 3]

評価結果をキーに、評価された要素を配列にしたハッシュを返す。

(1..10).group_by{ |x| x % 3 }
 # => {1=>[1, 4, 7, 10], 2=>[2, 5, 8], 0=>[3, 6, 9]}

最小の値を返す。

[1, 2, 3, 4, 5].min
 # => 1

最大の値を返す。

[1, 2, 3, 4, 5].max
 # => 5

最小の値と最大の値を配列にして返す。

[1, 2, 3, 4, 5].minmax
 # => [1, 5]
18
20
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
20