Search

検索したいワードを入力してください

2019年02月19日

Rubyで配列の要素数を調べるための3つのメソッドまとめ

Rubyの配列(Arrayクラス)は、メソッドを利用して簡単に操作できるという特徴があります。この記事では、要素数を調べるための3つのメソッドについて紹介します。さらに、Sgringなど他のクラスにもある、似たような機能のメソッドについても説明します。

Rubyにおける配列の特徴

Rubyにおける配列(Arrayクラス)には、以下の特徴があります。
(1)異なるクラスでも同じ配列に格納できる。
(2)サイズが要素数に応じて自動的に変化する。
(3)要素の追加、削除、更新、検索がArrayクラスのメソッド一つでできる。
(4)添字に範囲演算子を用いることで、部分配列を取得できる。

当記事では、(3)の検索に関連する、要素数の取得方法について解説します。

Rubyのその他の配列操作に関する記事はこちら
Rubyの配列の要素や配列自体を削除する方法
Rubyの配列から要素を検索する方法
Rubyの配列を結合する方法
Rubyの配列を並び替える(ソート)方法
Rubyの配列を初期化する方法
Rubyで配列要素を追加する方法

lengthメソッドで配列の要素数を取得する

lengthメソッドは、配列の全要素数を取得できます。要素にnilが含まれていてもすべてカウントされることに注意してください。要素番号は0から始まるので、得られる値は、(最大要素番号)+1となります。

lengthメソッドの使用例

以下のRubyスクリプトでは、配列arr1,arr2の要素数をlengthメソッドによって取得しています。

arr1=Array.new(5)
p arr1 => [nil, nil, nil, nil, nil]
p arr1.length #=> 5

arr2=["foo","bar","baz"]
p arr2.length #=>3

sizeメソッドで配列の要素数を取得する

sizeメソッドも、lengthメソッドと同じく配列の全要素数を取得できます。このように、Rubyには異なる名前で同じ機能を持つメソッドが多くありますが、スクリプト内の文脈によって使い分けると良いでしょう。

sizeメソッドの使用例

以下のRubyスクリプトでは、配列arrの要素数をsizeメソッドによって取得しています。

arr=["foo","bar","baz"]
p arr.size #=>3

countメソッドで配列の要素数を条件付きで取得する

countメソッドでは、引数やブロックを指定すると、条件付きで該当する要素の数を取得できます。何も引数を指定しない場合はlengthやsizeメソッドと同じく、配列の全要素数が返されます。

countメソッドの使用例

以下のRubyスクリプトでは、整数(Integer)配列nums、文字列(String)配列fruitsにおいて、countメソッドで要素数を取得しています。

nums=[3,1,4,1,5,9,2,6,5,3,5,8,9,7,9]
#全要素数
p nums.count #=> 15
#値が9の要素の数
p nums.count(9) #=> 3
#値が9でない要素の数
p nums.count{|n|n!=9} #=> 12

fruits=%w(Apple Banana Orange Pineapple Peach Grape)
#全要素数
p fruits.count #=>15
#Pで始まる要素の数
p fruits.count{|w|w.start_with?("P")} #=>2
#eで終わる要素の数
p fruits.count{|w|w.end_with?("e")} #=>4

条件を満たす配列そのものを得るには?

個数ではなく、条件に合致する要素を得るにはselectメソッドを用います。逆に、合致しない要素を得るにはrejectメソッドを用います。
以下は、前記の配列fruitsを使ったRubyスクリプトです。

p fruits.select{|w|w.start_with?("P")}
#=> ["Pineapple", "Peach"]
p fruits.reject{|w|w.start_with?("P")}
#=> ["Apple", "Banana", "Orange", "Grape"]

メソッドを用いなくても末尾の要素を得られる

Rubyの配列は、要素数を得るメソッドを用いなくても、添字に負の数を用いることで、末尾から数えた要素を取得できます。末尾の添字は-1で、先頭に向かって-2、-3...と進みます。
以下は、前記の配列fruitsを使ったRubyスクリプトです。

p fruits[fruits.length-1] #=> "Grape"
p fruits[-1] #=> "Grape"
p fruits[-2] #=> "Peach"
#3番目から最後まで
p fruits[3..-1] #=> ["Orange", "Pineapple", "Peach", "Grape"]

他のクラスにも同じ名前のメソッドがある

ハッシュ(Hashクラス)や文字列(Stringクラス)にも同じ名前のメソッドがあります。

length、sizeメソッドはHashクラスではキーの数、Stringクラスでは文字列の長さを返します。countメソッドはHashクラスではキーの数、Stringクラスでは1つ以上の引数が必須で、特定の文字の数を返します。

このように、同じ名前でも、クラス間でメソッドに微妙な違いがあります。

Array、Hash、Stringクラスにおける添字、メソッドの使用可否

ここまでで説明した方法を、Array、Hash、Stringクラスにおいて使用可能か否かをまとめると、以下の表のようになります。

ArrayHashString
length
size
count○(要引数)
添字でのアクセス×
select×
reject×

Array、Hash、Stringクラスを利用したコードの例

puts"-----fruit-----"
p fruits={"Apple"=>"red","Banana"=>"yellow","Pineapple"=>"gold","Peach"=>"pink","Grape"=>"purple"}
p fruits.class
p fruits.length
p fruits.size
p fruits.count
p fruits.select{|k,v|k.start_with?("P")}
p fruits.count{|k,v|k.start_with?("P")}
p fruits[-1]
puts

puts"-----fruits_keys-----"
p fruits_keys=fruits.keys
p fruits_keys.class
p fruits_keys.length
p fruits_keys.size
p fruits_keys.count

p fruits_keys.select{|k|k.start_with?("P")}
p fruits_keys.count{|k|k.start_with?("P")}
p fruits_keys[-1]
puts
puts"-----fruits_keys_first-----"
p fruits_keys_first=fruits_keys[0]
p fruits_keys_first.class
p fruits_keys_first.length
p fruits_keys_first.size
p fruits_keys_first.count rescue p $!

p fruits_keys_first.select{|ch|ch=="p"} rescue p $!
p fruits_keys_first.count{|ch|ch=="p"} rescue p $!
p fruits_keys_first.count("p")
p fruits_keys_first[-1]

実行結果

-----fruit-----
{"Apple"=>"red", "Banana"=>"yellow", "Pineapple"=>"gold", "Peach"=>"pink", "Grape"=>"purple"}
Hash
5
5
5
{"Pineapple"=>"gold", "Peach"=>"pink"}
2
nil

-----fruits_keys-----
["Apple", "Banana", "Pineapple", "Peach", "Grape"]
Array
5
5
5
["Pineapple", "Peach"]
2
"Grape"

-----fruits_keys_first-----
"Apple"
String
5
5
#<ArgumentError: wrong number of arguments (0 for 1+)>
#<NoMethodError: private method `select' called for "Apple":String>
#<ArgumentError: wrong number of arguments (0 for 1+)>
2
"e"

Hashクラスでは、順番がないので、添字で指定した場合は必ずnilとなります。Stringクラスでは、select/rejectメソッドを用いようとするとNoMethodErrorとなります。

countメソッドは1つ以上の引数を指定する必要があるので、引数を省略したり、ブロックを使ったりするとArgumentErrorとなります。

クラス間でのメソッドの扱い方の違いに注意しよう

以上から、length、size、countメソッドはいずれも配列の全要素数を得ることができ、countメソッドでは、引数やブロックを利用して、ある条件を満たす要素の数を得ることもできることが分かります。

似たような操作はHash、Stringクラスでも可能ですが、使用方法などに違いがあります。クラスを把握していないと、予期しない値や、エラーになったりすることがあるので注意しましょう。

Rubyのその他の配列操作に関する記事はこちら
Rubyの配列の要素や配列自体を削除する方法
Rubyの配列から要素を検索する方法
Rubyの配列を結合する方法
Rubyの配列を並び替える(ソート)方法
Rubyの配列を初期化する方法
Rubyで配列要素を追加する方法

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related