スキップしてメイン コンテンツに移動
Ruby 配列関連のいろいろ

Ruby 配列関連のいろいろ

配列(Array)の宣言

 # 4つの数値をもつ配列を作成
 ary = [1, 2, 3, 4]

 # Array.new で3つの要素持つ配列を作成
 # 各要素は nil で初期化される
 ary = Array.new(3)
 #=> [nil, nil, nil]

配列要素へのアクセス

配列インデックスは0〜始まります。
 ary = [1, 2, 4, 6]
 # 3番目の要素にアクセス
 p ary[2]
 #=> 4

 # 存在しない要素にアクセスした場合は、nilが返ります
 p ary[10]
 #=> nil

 # 2番目の要素の値を変更します
 ary[1] = 100
 p ary[1]
 #=> 100

first

配列の先頭要素を取得します。
空の配列の場合、nil が返ります。
 ary = [1, 2, 4, 6]
 p ary.first
 #=> 1

first(n)

先頭の n 要素を配列で返します。n は 0 以上でなければなりません。
 ary = [1, 2, 4, 6]
 # 先頭の2要素を配列で取得
 p ary.first(2)
 #=> [1, 2]

last

配列の最終要素を取得します。
空の配列の場合、nil が返りるのは first と同じ

last(n)

末尾の n 要素を配列で返します。n は 0 以上でなければなりません。
使用方法は first(n) と同じです。

繰り返し処理

each / each_index / each_with_index

配列要素数分、指定したブロックを実行します。
呼び出す関数よって、ブロックに渡される引数が以下の通り変わります。
 ary = [2, 4, 6, 8]
 
 # [each関数] ブロックの引数には、各要素の値が入る
 ary.each { |v| p v }
  #=> 2 4 6 8
  
 # [each_index関数] ブロックの引数には、配列インデックスの値が入る
 ary.each_index { |i| p i }
  #=> 0 1 2 3
  
 # [each_with_index関数] ブロックの引数には、配列の値と、インデックスの2つが入る
 ary.each_with_index { |v,i| p "index=#{i} value=#{v}" }
  #=> index=0 value=2
  #=> index=1 value=4
  #=> index=2 value=6
  #=> index=3 value=8

要素の検索

select / find_all

ブロック内の式が trueになる要素だけを抽出します。
find_all は select と同義です。
trueになる要素がない場合は空の配列が返ります。
 # 2で割り切れるものを抽出する
 ary = [1, 2, 3, 4, 5, 6]
 ary.select { |n| n % 2 == 0 }
 # => [2, 4, 6]

 # 9で割り切れるものがないので空の配列が返る
 ary.select { |n| n % 9 == 0 }
 # => []

 # hashの検索
 # - valueが1のものを抽出する
 {:a => 1, :b => 2}.select { |k, v| v == 1 }
 # => {:a => 1}

reject

selectの反対で、ブロック内の式が falseになる要素だけ を抽出します。
これも、falseになる要素がない場合は空の配列が返ります。
 # 2で割り切れるものじゃないものを抽出する
 ary = [1, 2, 3, 4, 5, 6]
 ary.reject { |n| n % 2 == 0 }
 # => [1, 3, 5]

find / detect

ブロック内の式がtrueになった 最初の要素 を検索して返します。
detectfind と同義です。
trueになる要素がない場合はnilが返ります。
# 最初の3を探す
ary = [1, 3, 4, 3, 5]
ary.find { |n| n == 3 }
# => 3

# 該当する要素がない場合 nil が返る
ary.find { |n| n == 10 }
# => nil

grep

grepの引数に マッチする要素だけ を抽出します。
引数には正規表現が使えます。
マッチする要素がない場合は空の配列が返ります。
# 数字を含むものを抽出する
['a1', 'bb', 'c2', 'dd', '5e'].grep(/[0-9]/)
# => ["a1", "c2", "5e"]

# 大文字の英語を含むものがないので空の配列が返る
['a1', 'bb', 'c2', 'dd', '5e'].grep(/[A-Z]/)
=> []
ちなみに、要素の位置を知りたい場合は find_index を使えばOKです。
# 最初の3の倍数の位置を探す
[1, 5, 8, 2, 6, 3].find_index { |n| n % 3 == 0 }
# => 4

要素の追加

push / append

配列の末尾に、引数で指定した値を追加します。
 ary = [1, 2, 3, 4]
 ary.push(5)
 #=> [1, 2, 3, 4, 5]
引数を複数指定すると、指定された順番に配列の末尾に追加します。
 ary = [1, 2, 3, 4]
 ary.push(5, 6)
 #=> [1, 2, 3, 4, 5, 6]

要素の削除

delete

引数で指定した値と等しい値を持つ要素を削除します。
 ary = [1, 4, 5, 4, 2]
 ary.delete(4)
 => [1, 5, 2]

delete_at

指定した配列インデックスの要素を削除します。
 ary = [1, 4, 5, 4, 2]
 ary.delete_at(1)
 => [1, 5, 4, 2]

delete_if

ブロックの結果が true の要素をすべて削除します。
戻り値には self が返ります。
 ary = [1, 4, 5, 4, 2]
 ary.delete_if { |v| v == 4 || v == 5 }
 => [1, 2]

最大・最小・合計・平均値を求める

max (最大値)

 ary = [1, 2, 3, 4]
 # max 関数で最大値を求める
 p ary.max  #=> 4

min (最小値)

 # min 関数で最小値を求める
 p ary.min  #=> 1

sum (合計値)

 # sum 関数で最大値を求める
 p ary.sum  #=> 10

平均値は inject を応用

 # 平均値は inject 関数を使用して求める
 p ary.inject(0.0){ |r,i| r += i } / ary.size  #=> 2.5

要素の並び替え

reverse (要素の反転)

 ary = [1,2,3,4]
 # 要素を反転させた新しい配列を作成
 new_ary = ary.reverse

 # 自身の配列そのものを反転させる場合は、 reverse! を使用する 
 ary.reverse!

sort (ソート)

 ary = [4, 3, 2, 1]
 # 昇順にソートした新しい配列を作成
 sort_ary = ary.sort   #=> [1, 2, 3, 4]
 
 # 自身の配列そのものをソート
 ary.sort   #=> [1, 2, 3, 4]
 
 # 降順でソートする関数は用意されていないため、ブロックでソート条件を指定
 ary.sort { |x1, x2| (-1) * (x1 <=> x2) }
 #=> [4, 3, 2, 1]
補足
<=> 比較演算子は、
x1 < x2 の場合 -1を、
x1 = x2 の場合 0を、
x1 > x2 の場合 1を返します。

sort_by (ソート対象の項目を指定してソート)

 ary = [{:key => "foo"}, {:key => "bar"}, {:key => "zaz"}, {:key => "yux"}]
 # 各要素の downcase の昇順で並び替えた作成を作成する
 sort_ary = ary.sort_by { |v| v[:key] }
 # => ["bar", "foo", "yux", "zaz"]
 
 # 自身の配列そのものをソート
 ary.sort_by! { |v| v[:key] }
 # => ["bar", "foo", "yux", "zaz"]
スポンサーリンク
スポンサーリンク
スポンサーリンク

コメント

このブログの人気の投稿

axiosの使い方まとめ (GET/POST/例外処理)

axiosの使い方まとめ (GET/POST/例外処理)最近何かとよく使うJavaScriptでAJAX通信を行うaxiosについて、簡単に使い方をまとめました。GETリクエストをaxiosで送るまずはGETリクエストをaxiosで送る方法です。const res =await axios.get('/users') console.log(res.data)分割代入の記法を使うと、以下のようにも書けますconst{data}=await axios.get('/users') console.log(data)クエリパラメータ (URLパラメータ)を指定クエリパラメータを指定する方法は2つあります。1つ目は、axios.getに指定するURLに直接記述する方法です。axios.get('/user?id=123')2つめは、axios.getの第2引数に、オプション指定する方法です。axios.get('/user',{ params:{ id:123}})POSTリクエストをaxiosで送る次はPOSTリクエストをaxiosで送る方法です。JSON形式でPOSTするJSON形式でPOSTする場合は、axios.postの第2引数に、送信するデータをJavaScriptオブジェクトで指定します。const res =await axios.post('/user',{ id:123, name:'Yamada Tarou'})application/x-www-form-urlencoded形式でPOSTするapplication/x-www-form-urlencoded形式でPOSTする場合は、URLSearchParamsを使います。var params =newURLSearchParams() params.append('id',123) params.append('name','Yamada Tarou')const res =await axios.post('/user', params)axios でファイルをアップロードする画像などのファイルを、axiosでアッ…

[VB, C#] Windows 8, Window 10 で ImeModeが制御できない問題を解決する

[VB, C#] Windows 8, Window 10 で ImeModeが制御できない問題を解決するタイトルの通りですが、Windows 8 以降では Windows Form アプリケーションで、コントロールの ImeMode に Katakana や KatakanaHalf を設定しても、カタカナになってくれません。なぜ ImeMode が効かないのか?Windows 8 以降、IME Mode の切り替えは、ユーザー単位で切り替わるようになった為、アプリから IME Mode 制御が出来ないようになりました。
(IME をON にした場合、常に ひらがな モードになます)※ Windows 7までは、IME Modeの切り替えはアプリ単位で行われていた為、問題なくアプリから IME制御が行えました。対処方法Windows 8 以降、IMEの制御は、InputScope クラスの利用が推奨されています。
しかし、InputScope クラスは、WPF、Windows ストアアプリでしか使えない為、Windows Formアプリでは使用できません。
(Windows Form はもう使うな!という事でしょうか (涙) )結論としては、コントールパネルの設定で、IMEの制御をユーザ単位から アプリ単位に変更する事ができます。
これで、Windows Formアプリでも 従来通りIMEの制御を行う事が出来ます。おわりにこの方法だと、アプリをインストールする端末すべてに設定が必要となり、とっても面倒です。。。
しかし、今の所これしか方法がない状態です。
これからは Windows Formではなく、WPFや Windows ストアアプリで作れという事ですかね (^^;)

MailKitの使い方! エンコーディング指定や添付ファイをメールで送信する方法[C#/VB Tips]

MailKitの使い方! エンコーディング指定や添付ファイをメールで送信する方法[C#/VB Tips]MailKitを使ってメールを送るサンプルコードです。(C#)UTF8/iso-2022-jpのエンコーディング指定、GMail/YahooのSMTPサーバで送るなど、4つのサンプルコードでMailKitの使い方を紹介します。MailKitって何?2017年に.NET標準のSystem.Net.Mail.SmtpClientが廃止予定となり、Microsoftより今後はオープンソースライブラリである、MailKitに置き換えるとアナウンスがありました。既にSmtpClientは非推奨になっており、今後は廃止されていきます。現在、SmtpClientを使用したソースコードには、Visual StudioからMailKitを使うよう警告が出るようになっています。さっそく、MailKitを使ってメールを送信するサンプルコードを作っていきます。UTF8でメールを送信文字エンコーディングを、UTF8でメールを送信するサンプルコードです。
MailKitは、デフォルトの文字エンコーディングがUTF8なっている為、シンプルなコードでメールを送信する事ができます。var host ="<smtp server name>"; var port =25;// or 587using(var smtp =new MailKit.Net.Smtp.SmtpClient()){//SMTPサーバに接続する smtp.Connect(host, port, MailKit.Security.SecureSocketOptions.Auto);//認証が必要な場合は、以下のコメントを解除//smtp.Authenticate("<id>", "<password>");//送信するメールを作成する var mail =new MimeKit.MimeMessage(); var builder =new MimeKit.BodyBuilder(); mail.From.Add(new MimeKit.MailboxAddress("",&quo…