狠狠撸

狠狠撸Share a Scribd company logo
第3回 配列
参考書:スッキリわかるJava入門 第2版
目次
? 配列とは
? 配列の用語説明
? 配列の使い方
? forとの組み合わせ
? 配列の詳細
? 多次元配列
? 演習
1
目次
? 配列とは
? 配列の用語説明
? 配列の使い方
? forとの組み合わせ
? 配列の詳細
? 多次元配列
? 演習
2
配列
同一種類の複数データを並び順で格納するデータ構造
int int int int int
? ① ② ③ ④
3
データ構造
いくつかの関係あるデータをグループにして、
まとめて1つの変数に入れる仕組み
4
目次
? 配列とは
? 配列の用語説明
? 配列の使い方
? forとの組み合わせ
? 配列の詳細
? 多次元配列
? 演習
5
配列
同一種類の複数データを並び順で格納するデータ構造
[0] [1] [2] [3] [4]
6
要素
配列としてまとめてある変数の、一つ一つ
基本的には変数と同じ性質
[0] [1] [2] [3] [4]
7
添え字
indexとも言う。番号。ゼロから始まる。
[0] [1] [2] [3] [4]
8
目次
? 配列とは
? 配列の用語説明
? 配列の使い方
? forとの組み合わせ
? 配列の詳細
? 多次元配列
? 演習
9
配列の作成
データを入れる箱を用意するために、2つの手順が必要
//配列の宣言
要素の型[] 配列名;
//要素の作成
配列名 = new 要素の型[要素数];
10
「変数」との比較
箱の作成
int age; //変数の宣言
int[] scores; //配列の宣言
scores = new int[5]; //要素の作成
11
配列の作成
これもまとめて書ける
要素の型[] 配列名 = new 要素の型[要素数];
12
「変数」との比較
まとめて書く
int age = 20; //初期化
int[] scores = new int[5]; //配列の作成
13
要素に代入
作成した配列の要素に、データを代入する
配列名[添え字] = データ;
//配列scoresの0番目の要素に代入
scores[0] = 70;
14
配列の初期化
「配列の作成」と「要素への代入」をまとめて行う
要素の型[] 配列名 = new 要素の型[]{初期値1,初期値2,???};
要素の型[] 配列名 = {初期値1,初期値2,???};
15
配列の初期化の注意点
16
実演
17
実演
18
ちなみに
19
目次
? 配列とは
? 配列の用語説明
? 配列の使い方
? forとの組み合わせ
? 配列の詳細
? 多次元配列
? 演習
20
forで楽するテクニック
配列は添え字で要素を指定して、計算や代入なんかを行う
そこにforを組み合わせると、だいぶ楽できる
21
実演
22
実演
添え字は
ゼロから
要素数
添え字は
1刻み
23
実演
24
要素数
配列の要素数は覚えておく必要がない
配列名.length
//配列scoresの要素数
scores.length
25
実演
26
実演
27
目次
? 配列とは
? 配列の用語説明
? 配列の使い方
? forとの組み合わせ
? 配列の詳細
? 多次元配列
? 演習
28
どうなる?
29
こうなる
30
メモリ
主記憶装置とも言う
容量は小さいが、高速で読み書きができる
変数や配列はここに作られている
31
イメージ図
A
B
C
a b c d e f g
Aa
Be
32
int x = 10;
A
B
C
a b c d e f g
10
33
int x = 10; int y = x;
A
B
C
a b c d e f g
10 10
34
int[] nums1 = new int[4];
A
B
C
a b c d e f g
10 10
[0] [1] [2] [3]
35
int[] nums1 = new int[4]; int[] nums2 = nums1;
A
B
C
a b c d e f g
10 10
[0] [1] [2] [3]
36
どうなる?
37
こうなる
38
基本型と参照型
基本型変数
区画に保存されているデータそのものをやりとりする変数
参照型変数
区画のアドレスをやりとりする変数
39
参照を切る
配列名だけだと、その配列の最初の要素のアドレスを意味する
このようなアドレスを指し示す動作のことを「参照」と呼ぶ
それを消し去る方法
null
40
実演
41
実演
42
ガベージコレクション
プログラムを実行していくうえで発生した、メモリ内のゴミを片付けて
くれる仕組み
43
目次
? 配列とは
? 配列の用語説明
? 配列の使い方
? forとの組み合わせ
? 配列の詳細
? 多次元配列
? 演習
44
多次元配列
配列を格納した配列のこと
今までの配列は1次元配列
配列を格納した配列は2次元配列
配列を格納した配列を格納した配列は3次元配列
配列を格納した???
45
2次元配列
1次元配列に付け足す感じ
要素の型[][] 配列名 =
new 要素の型[外側の配列の要素数][内側の配列の要素数];
配列名[外側の配列の要素番号][内側の配列の要素番号]
46
実演
47
図
[0](Aクラス) [1](Bクラス)
10 20 30 50 70 90
[0][0] [0][2] [1][0] [1][2][0][1] [1][1]
48
多次元配列
49
目次
? 配列とは
? 配列の用語説明
? 配列の使い方
? forとの組み合わせ
? 配列の詳細
? 多次元配列
? 演習
50
演習①
int型の要素を3つ格納する配列を作成し、それぞれの要素に好きな
値を入れて、出力せよ。
51
演習②
int型の要素を7つ格納する配列を作成し、for文の中で、各要素へ
のデータの代入及び出力を行うプログラムを作成せよ。
52
演習③
外側の配列の要素数が3、内側の配列の要素数が5の2次元配列
を作成し、for文のネストを用いて、要素へのデータの代入及び出力を
行うプログラムを作成せよ。
「外側の配列の要素数が3、内側の配列の要素数が5の2次元配列」
例) int[][] ex = new int[3][5];
53

More Related Content

More from XMLProJ2014 (20)

闯补惫补班讲义资料第2回
闯补惫补班讲义资料第2回闯补惫补班讲义资料第2回
闯补惫补班讲义资料第2回
XMLProJ2014
?
第1回闯补惫补讲义资料
第1回闯补惫补讲义资料第1回闯补惫补讲义资料
第1回闯补惫补讲义资料
XMLProJ2014
?
00环境构筑
00环境构筑00环境构筑
00环境构筑
XMLProJ2014
?
Mash up awards(クリスマス会)
Mash up awards(クリスマス会)Mash up awards(クリスマス会)
Mash up awards(クリスマス会)
XMLProJ2014
?
きのこたけのこ戦争
きのこたけのこ戦争きのこたけのこ戦争
きのこたけのこ戦争
XMLProJ2014
?
クリパ用尝迟2014
クリパ用尝迟2014クリパ用尝迟2014
クリパ用尝迟2014
XMLProJ2014
?
ポケモン解説
ポケモン解説ポケモン解説
ポケモン解説
XMLProJ2014
?
クリスマス会尝迟
クリスマス会尝迟クリスマス会尝迟
クリスマス会尝迟
XMLProJ2014
?
一年ツイッター
一年ツイッター一年ツイッター
一年ツイッター
XMLProJ2014
?
颁++班
颁++班颁++班
颁++班
XMLProJ2014
?
颁#班
颁#班颁#班
颁#班
XMLProJ2014
?
奥别产班
奥别产班奥别产班
奥别产班
XMLProJ2014
?
Web 11
Web 11Web 11
Web 11
XMLProJ2014
?
Web 09
Web 09Web 09
Web 09
XMLProJ2014
?
础苍诲谤辞颈诲班第4回
础苍诲谤辞颈诲班第4回础苍诲谤辞颈诲班第4回
础苍诲谤辞颈诲班第4回
XMLProJ2014
?
Web 10
Web 10Web 10
Web 10
XMLProJ2014
?
OpenSource
OpenSourceOpenSource
OpenSource
XMLProJ2014
?
百合について
百合について百合について
百合について
XMLProJ2014
?
Web 08
Web 08Web 08
Web 08
XMLProJ2014
?
Web 08
Web 08Web 08
Web 08
XMLProJ2014
?

闯补惫补班讲义资料第3回

Editor's Notes

  • #5: 噛み砕くと、「同じ型のデータをいくつかまとめて、順番に管理できるもの」という感じ。 「同じ型」というところが大事。0番目の箱にint、1番目の箱にStringとかは無理。 番号がわざわざ「0」から始まっていることがポイント、ここの説明はまた後で。 ところで、「データ構造」とは?
  • #6: ほとんどのプログラミング言語に用意されている。これの代表的なものが配列。 配列は同じ型の変数しか扱えなかったが、違う型の変数でも扱えるデータ構造も存在する。 まとめて扱う具体例:「Aクラス40人ぶんの、数学のテストの点数」を40個の変数で扱うよりも1つの配列にまとめた方が何かと楽。「S君の『名前』『電話番号』『メールアドレス』」をバラバラに扱うよりも「S君」でまとめた方が何かと楽。
  • #7: 使い方を知る前に、配列に関する用语を説明。
  • #8: 配列は同じ型の変数しかまとめられないって話をしたので「int」ってのは省略。 さらに、番号の書き方を変えた。この書き方は後に繋がってくるので、とりあえず番号なんだな、と認識しておく。 何か同じ型の変数が5つまとまっている。このまとまりが、1つの配列。
  • #9: 並んでいる箱の一つ一つを「要素」と言う。 一番左から、「0番目の要素」「1番目の要素」???といった感じ。 今まで使ってきたような変数と同じように、計算したり、代入したりできる。 もちろん、同じ配列に属する要素は全て同じ型になる。
  • #10: 配列は複数データを並び順で格納するため、それぞれのデータを区別するために番号を付ける。この番号が添え字。 ゼロから始まることに注意。0~4の5つという考え方。1~5ではない! 「配列とは」で0番目から始めていたのは、ここで矛盾を発生させないため。
  • #12: 箱を用意するには、「配列の宣言」と「要素の作成」という2つの手順を踏む。 「要素の作成」にはnew演算子というものを使う。「新しく作るからnew」くらいの認識で大丈夫。多分。 どちらの手順でも、使うカッコは「{}」ではなく「[]」であることに注意。 要素数というのは、まとめて格納したいデータの数。 つまり、配列を作成する時点で、その配列にいくつのデータを入れたいのか、決めておく必要がある。
  • #13: 今まで使ってきた変数は宣言しただけで箱を作成することができた。 しかし配列は、宣言したうえで、要素を作成しなければならない。 要素を作成して初めて、データを格納できる。
  • #15: 今まで使ってきた変数で「まとめて书く」と言えば初期化のことだったが、配列の场合は「配列の作成」に必要な2つの手顺をまとめたというだけであり、初期化ではない。配列の初期化は、また后で。
  • #16: 先ほど説明した手顺で配列を作成したら、その配列名に「[]」で括った添え字をつけることで要素を指定し、そこにデータを代入することができる。0番目の要素にデータを入れたかったら、添え字の部分に0を入れる。
  • #17: 2つの方法がある。new演算子を使う方法と使わない方法。 どちらも、「{}」の中で、要素に代入したいデータを直接入力している。 この場合、入力したデータの数がそのまま要素数となる。 下の方が明らかに打つ量が少ないから上なんて必要ないのかと言うと、そうでもない。
  • #18: 2つの方法を、あえて配列の宣言と分けてやってみた。 new演算子を使う方は、宣言と分けても問題なく動く。 しかし使わない方は、エラーが出る。 もしnew演算子を使わないで初期化をしたいなら、宣言と分けてはいけない。
  • #19: 3人分の点数を格納する配列scoresを作成。 0番目、1番目には点数を代入するが、2番目にはあえて代入しない。 (※要素数は3つだが、0~2の3つであることに注意。1~3ではない!) それぞれのデータを出力してみる。
  • #20: データを代入しなかった2番目の要素にはゼロが入っていた模様。 このように、配列の要素にはあらかじめ値が入っている。 intやdoubleのような数値を入れる型にはゼロ、他の型にも何かしら決まった値が入れられている。
  • #21: 今まで使ってきたような普通の変数はきちんと値を代入しないと使えない。 配列とごちゃごちゃにならないように注意。
  • #23: これは见た方が早い。
  • #24: 5人分のテストの点数をまとめた配列scores 点数を出力したいけれど、ひとつずつ、sysoutで出力するのは面倒 そこでforの出番! 「i」が添え字の代わりになってくれる もう少し詳しく説明
  • #25: 繰り返しの基準となる「i」を添え字と同じくゼロから始まるようして、 条件式は出力したいデータが5つあるので「i < 5」としておき、 処理が終わると「i」が1増えるようにしておけば、 繰り返しのなかで「i」が添え字の代わりとなってくれる。
  • #26: きちんと出力されている。
  • #27: 配列のデータを途中で増やしたり減らしたりしたとき、そこに対応する部分を全て書き換えるのは面倒 配列名に「.length」をつけたものが、その配列の要素数を示すものになる 配列のデータを増やそうと減らそうと、きちんと変化してくれる 今までになかった書き方だけど、後で意味がわかるようになる。はず。
  • #28: さっきのソースを少し書き換えたもの scores.lengthを使って要素数を出力する部分を加えて forの条件式にscores.lengthを用いている scores.lengthは配列scoresの要素数、この場合は5を意味する
  • #29: きちんと出力されている。
  • #30: 配列は今まで使ってきた変数とは挙动が违う部分がある
  • #31: 配列nums1を作成し、それをnums2に代入 その後、nums2の0番目の要素に100を代入 最後に、nums1の0番目の要素を出力 結果はどうなる?「1」?
  • #32: 100が出力される。 nums1の0番目の要素を出力したはずなのに、nums2の0番目の要素に代入した100が出力された nums1の0番目の要素は最初、1だったはず この現象を理解するには、多少ハードな部分に入り込むことになるが、ここを理解しておかないと後々躓いてしまうかもしれないので頑張る
  • #33: まずはメモリについて軽く説明。 推奨機ならたぶん4GB、増築してると8GBとかかもしれない。 HDDやSSDが長期的にデータを保存できるのに対し、メモリは一時的にしか保存できない さらに、容量もHDDやSSDと比べて格段に小さい その代わり、比べものにならないくらい読み書きが速い 普通にプログラミングするぶんには、変数や配列はここに作られている。多分。 CPUが脳、メモリが机の上、HDDやSSDが机の引き出しなんかによく例えられる。
  • #34: メモリは碁盤の目のように区画整理されており、各区画にはアドレスが割り振られている アドレスとは、住所と同じようなもの。その区画がメモリのどこにあるのかを示す。 今回は仮に、縦と横に大文字と小文字のアルファベットを割り当て、その区画がどのアルファベットに属しているかでアドレスを決めることにする。
  • #35: まずは今まで使ってきたような変数について考える 変数を作成すると、メモリの空いてる場所を確保し、そこにデータを保存する なので、今まで「箱」と言っていたものは、メモリに確保された区画のこと。と言いつつ、メモリの中にさらに箱があるような図になってしまっているけれど、これは見た目を優先した結果ということで、あまり深くは考えないでくれるとありがたいです。
  • #36: 新たに変数yを作成し、xを代入する そうすると、「x」が確保している区画Abに保存されているデータが、「y」が確保した区画にコピー?保存される 『その区画に保存されているデータ』が、コピー?保存される。ここが重要。
  • #37: 次に配列だとどうなるか、見てみる。 配列を作成すると、要素数ぶんの区画を確保する この時点で既にゼロが代入されているって話はさっきした。ただし、配列の要素ってことがわかりやすいように、箱にはデータではなく添え字を書いている。 ここで最も重要なのは、「nums1」には「Bc」というアドレスが入っているということ。 もう少し詳しく言うと、「配列名[添え字]」という書き方は、その配列に属する特定の要素を意味しており、「配列名」のみだと、「その配列の最初の要素のアドレス」を意味する。 「その配列の最初の要素のアドレス」とはつまり、配列がどの区画から始まるかを示すアドレス、ということ。
  • #38: そうすると、配列nums2に代入されるデータは、「nums1」が示すアドレス、つまり「Bc」ということになる よって、「nums1」と「nums2」は、どちらもスタート地点が同じ配列ということになり、「nums1[0]」と[nums2[0]」が同じ要素を示すことになる 今まで使ってきた普通の変数の場合は、『その区画に保存されているデータ』がコピー?保存されていたのに対して、配列は「配列名」で代入を行うと、『その配列の最初の要素のアドレス」がコピー?保存される。書き方は似ていても、実際に起きていることは全く違う。
  • #39: 配列nums1を作成し、それをnums2に代入 その後、nums2の0番目の要素に100を代入 最後に、nums1の0番目の要素を出力 結果はどうなる?
  • #40: 100が出力される。 nums1とnums2はどちらも同じアドレスを示しており、「nums1[0]」と「nums2[0]」は同じ意味となるから。
  • #41: ちなみに、区画に保存されているデータそのものをやりとりする変数を「基本型変数」と言い、区画のアドレスをやりとりする変数を「参照型変数」と言う。 基本型変数は今まで使ってきたようなintやbooleanなどを型とする変数 参照型変数は配列の他にも色々あって、どれを扱うにしても、今回説明した考え方を理解しておく必要がある
  • #42: さらにおまけ。 配列名だけを変数のように扱った場合、その配列の最初の要素のアドレスを指し示す こういった「アドレスを指し示す」変数にnullを代入すると、「どこも指し示さない」変数にできる
  • #43: 配列numsを初期化した後、numsにnullを代入 最後にnums[0]を出力 エラーは出てないように見えるが???
  • #44: 実行するとエラーが出る このエラーは要するに、「どこも参照していないからわからない」という感じの意味 配列numsの参照が、nullを代入することによって消え去ったので、nums[0]と書いても、どこの要素を示しているのかわからなくなっている かの有名な「ぬるぽ」はここから来ているらしい
  • #45: さらにさらにおまけ。 先ほどの配列numsにnullを入れると、アドレスを参照しなくなるけれど、メモリ上に要素は残ったままになってしまう それらは事実上、全く使われることのないゴミになり、溜まり続けると無駄にメモリを消費してしまうので、Javaが勝手にお片付けしてくれる この仕組みをガベージコレクションと呼ぶ。これのおかげで何かと楽できる。 この機能がないプログラミング言語では自分で後片付けをやることになる。 それがメリットにもデメリットにもなるので、どちらが良いとは一概に言えない。多分。
  • #47: 今までの配列は、これまで基本型の変数に入れてきたような値をまとめたものだったが、配列は複数の配列をまとめることもできる forのネストみたいに多少複雑ではあるが、慣れれば大したことはない ちなみに、3次元配列からはまとめて「多次元配列」と言う。らしい。
  • #48: 横に長くなってしまったので、2行にした。プログラムでは2行にする必要はない。 とりあえず2次元配列をやる これがわかれば次元が増えても大丈夫 なんとなく、1次元配列と書き方が似ていることはわかるのではなかろうか しかしこれだけだと、いまいち想像しにくいと思う というわけで実際に見てみる
  • #49: Aクラスの3人とBクラスの3人の点数をまとめた配列scoresを作成 まず、Aクラスの一郎、二郎、三郎の点数を代入 次に、Bクラスの四朗、五郎、六郎の点数を代入
  • #50: 図で示すとこんな感じ scoresは2つの要素を持っていて、それぞれの要素がさらに3つの要素を持っている
  • #51: 考え方は一緒 複雑で面倒になるだけ 必要なときだけ使おう
  • #55: 「外侧の配列」とか「内侧の配列」っていう言い方は俺が胜手に考えたもので、いまいちわかりにくい日本语だと思うので具体例を挙げておきます。