世界が幸せで在ります様に

ITエンジニアになりたい人・エンジニアの人にとって役立ちそうな商品を紹介するブログ

プログラミング超入門者必見!パンPの冒険『Rubyによるデータ構造リファレンス【配列編】』

f:id:sinsinchang:20180701202221j:plain

超入門者向けに,Rubyによるデータ構造リファレンスの配列を今回少し説明するよ.プログラミング超入門者は是非読んでね.

初級者以上の方は読まないほうがいいよ.

今回は,「配列編」だよ.

読者について

以下のように読者のレベルを分けて書くようにしてるよ.太字が対象だよ.

  • 超入門者・・・興味を持ってもらうことが目的だよ.
  • 入門者・・・プログラミング始めた人に向けた記事だよ.経験3ヶ月以内だよ.
  • 初級者・・・仕事でプログラミングする人に向けた記事だよ.経験1年以内だよ.
  • 中級者・・・リードエンジニアちょい手前ぐらいの人に向けた記事だよ.経験3年以内だよ.
  • 上級者・・・僕がこのレベルでないので書けないよ.

注意点

この記事でわからない用語があっても無視しましょう.まずは,雰囲気を感じ取ってもらうだけで大丈夫です.興味をもってもらうことが当記事の目的です.

自己紹介をするよ

パンP

f:id:sinsinchang:20180630153715g:plain・・・Webベンチャーに入社した生意気な名古屋のガキ.頭が切れる.ブラックちゃんのことが気になってる.

ブラックちゃん

f:id:sinsinchang:20180630154450g:plain・・・孤高のプログラマ.好みのタイプは静的言語.嫌いなものはstaticおじさん*1.知識はあるが宗教*2が強い.けっこう美人.すごいレアなパープルボーンの持ち主ゆえ人気があるらしい.かなりの教えたがり.

 

あらすじ

二人は怪しげなサークルで知り合った...

ある日,ブラックちゃんとご飯に行く約束を取り付けるため,パンPがプログラミングについて教えてほしいとお願いしたことから物語は始まった...もう後には戻れない

 

データ構造リファレンスってなにさ?

f:id:sinsinchang:20180630153715g:plain「わからんわ」

f:id:sinsinchang:20180630154450g:plain「プログラミングをするときに,いろんなデータを変数*3に入れるよね?」

f:id:sinsinchang:20180630153715g:plain「メモリ?」

f:id:sinsinchang:20180630154450g:plain「そうそう,メモリの番地のことだよ」

 

このあと,リファレンスについて,パンPはプログラミングできるレベルまでブラックちゃんから教わることになったよ...宗教が強いのでそのあたりを気をつけるようにしようとパンPは学んだよ...

Rubyでサンプルを書いてみます

f:id:sinsinchang:20180630154450g:plain「今日は配列*4のサンプル書いてみようね」

f:id:sinsinchang:20180630153715g:plain「Ruby*5で書くわ」

f:id:sinsinchang:20180630154450g:plain「あー動的言語*6つかっちゃう?パンPくん,静的言語の方が優れている話って聞いてた??」

f:id:sinsinchang:20180630153715g:plain「...Rubyで書くわ」

カタカタ...

f:id:sinsinchang:20180630153715g:plain「できた」

array = [*1..10] # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

f:id:sinsinchang:20180630154450g:plain「じゃあここから説明するね」

f:id:sinsinchang:20180630153715g:plain「はいよ」

f:id:sinsinchang:20180630154450g:plain「この配列は以下のようになってるね.index というのは配列の添字で,それに対応するのが要素よ」 

index 要素
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9

10

f:id:sinsinchang:20180630154450g:plain「パンPくん,indexが0番目の要素を取得したい時はどうする?」

f:id:sinsinchang:20180630153715g:plain「こんな感じ」

array[0] # 1

 

f:id:sinsinchang:20180630153715g:plain「でも,0番目が最初のindexって気持ち悪い...」

f:id:sinsinchang:20180630154450g:plain「こういう部分は,歴史的な影響があるのよ.じゃあ次はこの配列をランダムに並び替えてね」

f:id:sinsinchang:20180630153715g:plain「できた」

array.shuffle! # [3, 7, 5, 9, 2, 10, 4, 6, 1, 8]

 

f:id:sinsinchang:20180630154450g:plain「この`!`ってのが気持ち悪いわね」

f:id:sinsinchang:20180630153715g:plain「これは破壊的メソッドだで便利」

f:id:sinsinchang:20180630154450g:plain「そう.ランダムに並び替えたから配列は以下のようになってるね」

添字 要素
0 3
1 7
2 5
3 9
4 2
5 10
6 4
7 6
8 1
9 8

f:id:sinsinchang:20180630154450g:plain「じゃあ,次はindexが8のものを取り出してみて」

f:id:sinsinchang:20180630153715g:plain「こんな感じ」

array[8] # 1

配列の長所・短所って?

f:id:sinsinchang:20180630154450g:plain「配列の長所ってわかるかな??」

f:id:sinsinchang:20180630153715g:plain「わからん」

f:id:sinsinchang:20180630154450g:plain「indexを指定して要素を取得するってことよ」

f:id:sinsinchang:20180630153715g:plain「え!?逆にめんどくない?indexをいちいち指定すんの」

f:id:sinsinchang:20180630154450g:plain「するどいわねパンPくん.実は長所って言ったけど,短所でもあるのよ」

f:id:sinsinchang:20180630153715g:plain「だよね」

f:id:sinsinchang:20180630154450g:plain「長所は高速に処理できる点なのよ,最終的にコードは機械語に変換されて実行するから,」

f:id:sinsinchang:20180630153715g:plain「へー,パフォーマンスを重視するような時には便利ってことね」

f:id:sinsinchang:20180630154450g:plain「話は変わるけどRubyの場合,存在しないindexを指定するとnilが返るのよね〜」

array[10] # nil

 

f:id:sinsinchang:20180630153715g:plain「nilってなにい??」

f:id:sinsinchang:20180630154450g:plain「なにもないってことよ.言語によってはnullって表現したりもするわ」 

f:id:sinsinchang:20180630153715g:plain「うーん...これってめんどいね.例えば,要素にnilが入ってる時って判断できんがん」

array << nil # [3, 7, 5, 9, 2, 10, 4, 6, 1, 8, nil]

array[10] # nil

array[100] # nil

 

f:id:sinsinchang:20180630154450g:plain「そうね,index10とindex100はどちらもnilを返しちゃうから,その場合は何らかの方法で判定する必要があるね」

f:id:sinsinchang:20180630153715g:plain「どうすればええの?」

f:id:sinsinchang:20180630154450g:plain「仕様によるけど,nilが配列で欲しくないなら先にnilを要素から除去すればいいんじゃない?」

f:id:sinsinchang:20180630153715g:plain「いや,それだとindexが最初と変わっちゃうで,やっぱ配列の要素数と比較するとかがええかなあ」

f:id:sinsinchang:20180630154450g:plain「そっかあ,じゃあこんなんはどう??いっかい,nilを他のラベルに変えておいてindexから取得したときに区別できるようにするとか」

array_with_none = array.map { |x| x.nil? ? :none : x }

array_with_none[10] # :none

array_with_none[100] # nil

 

f:id:sinsinchang:20180630153715g:plain「あ,これいいかもね.わかりやすいかも」

f:id:sinsinchang:20180630154450g:plain「それは良かった〜.ちなみにだけど,例えば他の言語だと存在しないindexを指定するとエラーを吐いてくれるのよ」

f:id:sinsinchang:20180630153715g:plain「そうなんだ,どんなんがでるの??」

f:id:sinsinchang:20180630154450g:plain「JavaとPythonで書いてみるね」

Java

int[] array = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

System.out.println(array[10]);
--- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at Main.main(Main.java:8)

Python

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

print(array[10])
---

Traceback (most recent call last):
  File "Main.py", line 4, in <module>
    print(array[10])
IndexError: list index out of range

 

f:id:sinsinchang:20180630153715g:plain例外っていうんだよね確か」

f:id:sinsinchang:20180630154450g:plain「そうね,こういう初歩的なことがバグにつながるのよ」

 

このあと,ブラックちゃんはランチをパンPと楽しく食べた...もちろん,パンPは次の約束を取り付けたのだった...

おすすめの本だよ

Ruby超入門者向け

Ruby技術者認定試験合格教本
[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

  • 作者: 牧俊男,小川伸一郎,前田修吾,CTCテクノロジー株式会社
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/08/25
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る
 
 Ruby入門
初めてのRuby
初めてのRuby

初めてのRuby

 

次回予告

f:id:sinsinchang:20180630153715g:plain「あ,ブラックちゃん,最後に聞いていい??」

f:id:sinsinchang:20180630154450g:plain「どうしたのパンPくん??」

f:id:sinsinchang:20180630153715g:plain「なんでプログラミング言語ってたくさんあるの??静的とか動的とかめんどくさいんだけどさ..........あっ...」

ブラックちゃんはすごく嬉しそうな顔をしている...

f:id:sinsinchang:20180630154450g:plain「...それ今から語っていい??」

パンPは,いやな予感がした... 

f:id:sinsinchang:20180630153715g:plain「あ,やっぱいいや,今度で...」

 

つづく...

*1:staticを使いまくるって意味もあるけど,古い考え方とかを変えない頭の固いおじさん

*2:タブ幅が8??ありえないんだけど

*3:数や文字とかのデータを覚えておく入れ物

*4:複数の値の集合を管理するデータ構造

*5:日本人が作り,超絶便利・実用的で,すべてがオブジェクトであるプログラミング言語

*6:コンパイル時ではなく,実行時にプログラムのチェックが走る言語

プロフィールと免責事項