回答編集履歴
2
質問の意図を読み間違えていたので修正
test
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
-
length()は文字列の長さ lengthは配列の長さと簡単な覚え方ですが①は二次元配列ではないと認識しています。ただ、arrary[i].length()の意味を踏まえ、2つ目のwhile文の終わりどころがわかりません。
|
1
|
+
> length()は文字列の長さ lengthは配列の長さと簡単な覚え方ですが①は二次元配列ではないと認識しています。ただ、arrary[i].length()の意味を踏まえ、2つ目のwhile文の終わりどころがわかりません。
|
2
2
|
|
3
|
-
私の中では
|
4
|
-
|
3
|
+
配列arrayの中身はなんでしょうか? コード上では``String[] array = {"A","B"};``となっています。これは「文字列型の配列」です。
|
4
|
+
文字列は内部では配列になっています。C言語のchar型配列をクラスに包んでプログラマが意識せずに使えるように提供しているだけだと思います。
|
5
|
-
|
5
|
+
なので二次元配列と見なしてもいいかもしれません。厳密には違いますが。
|
6
6
|
|
7
|
-
知りたい事
|
8
|
-
1.while(j < array[i].length())の意味
|
7
|
+
> 知りたい事 1.while(j < array[i].length())の意味
|
8
|
+
|
9
|
+
``array[i].length()``はまず``array[i]``の値を取り出します。i = 0 のときは``array[0] = "A"``なので、"A"の長さを調べます。長さは1になりました。
|
10
|
+
よって``array[0].length()``は1となります。このようにして考えます。
|
11
|
+
|
9
|
-
2.length()無視してarrary[i]だけをみていいのか(その場合の理由も知りたいです)
|
12
|
+
> 知りたいこと 2.length()無視してarrary[i]だけをみていいのか(その場合の理由も知りたいです)
|
13
|
+
|
14
|
+
単にarray[i]のオブジェクトを取り出して、そのオブジェクトのlengthメソッドを動かしているだけです。
|
15
|
+
|
1
修正中
test
CHANGED
@@ -1,147 +1,9 @@
|
|
1
|
-
|
1
|
+
length()は文字列の長さ lengthは配列の長さと簡単な覚え方ですが①は二次元配列ではないと認識しています。ただ、arrary[i].length()の意味を踏まえ、2つ目のwhile文の終わりどころがわかりません。
|
2
|
-
コードは**ロジック**(論理)を記述したものです。
|
3
2
|
|
3
|
+
私の中では
|
4
|
+
「 j < array[i].length() 」-> 「 j < array[0].文字列 1 」-> jが要素番号と文字列より小さいなら⁇
|
4
|
-
|
5
|
+
という風になっておりそこから??となっています
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
String[] array = {"A","B"};
|
10
|
-
int i = 0;
|
11
|
-
while(i < array.length) {
|
12
|
-
int j = 0;
|
13
|
-
do {
|
14
|
-
++j;
|
15
|
-
}while(j < array[i].length()); //①
|
16
|
-
System.out.println(array[i] + ":" + j);
|
17
|
-
i++;
|
18
|
-
}
|
19
|
-
}
|
20
|
-
}
|
21
|
-
```
|
22
|
-
|
23
|
-
というコードを読むとしましょうか。コードを読むコツは**一行レベルで、その行が何をしているか考えながら読む**です。そのまま読んでもいいですが、慣れるまではコメントにしてみましょう。(実際の業務では直接コメントにしないように!)
|
24
|
-
|
25
|
-
まずJVMはmainメソッドを読み込みます。なので対象の処理は
|
26
|
-
|
27
|
-
```
|
28
|
-
String[] array = {"A","B"};
|
29
|
-
int i = 0;
|
30
|
-
while(i < array.length) {
|
31
|
-
int j = 0;
|
32
|
-
do {
|
33
|
-
++j;
|
34
|
-
}while(j < array[i].length()); //①
|
35
|
-
System.out.println(array[i] + ":" + j);
|
36
|
-
i++;
|
37
|
-
}
|
38
|
-
```
|
39
|
-
です。
|
40
|
-
|
41
|
-
これを一行レベルで読み込む。
|
42
|
-
|
43
|
-
```Java
|
44
|
-
// 1. 文字列の配列を用意して それぞれ"A"と"B"とする
|
45
|
-
String[] array = {"A","B"};
|
46
|
-
// 2. 変数 i を 0で初期化して宣言
|
47
|
-
int i = 0;
|
48
|
-
// 3. iの値がarraryの長さ未満の間
|
49
|
-
while(i < array.length) {
|
50
|
-
// 3.1. 変数 j を 0で初期化して宣言(毎回)
|
51
|
-
int j = 0;
|
52
|
-
// 3.2. do...whileの開始(whileの条件を満たしているときと初回時、行う)
|
53
|
-
do {
|
54
|
-
// 3.2.1. jをインクリメント(つまり j = j + 1)
|
55
|
-
++j;
|
56
|
-
// 3.3. j が 現在位置の配列の長さ未満の間上記(3.2.1)を繰り返す
|
57
|
-
}while(j < array[i].length()); //①
|
58
|
-
// 3.4. 現在位置の配列の値と j の値をそれぞれ出力
|
59
|
-
System.out.println(array[i] + ":" + j);
|
60
|
-
// 3.5. iをインクリメント (つまり i = i + 1)
|
61
|
-
i++;
|
62
|
-
}
|
63
|
-
```
|
64
|
-
|
65
|
-
これを実際に値を入れてシミュレーションしてみてください。
|
66
|
-
|
67
|
-
まず(1)で { "A", "B" } がそれぞれ与えられている。( これを arrayとする )
|
68
|
-
(2)で i = 0 となる。これらをノートかなんかに記録する。
|
69
|
-
|
70
|
-
```
|
71
|
-
array = { "A", "B" }
|
72
|
-
i = 0
|
73
|
-
```
|
74
|
-
|
75
|
-
(3)で「iがarrayの長さ未満の間」となりますが、iの値はなんでしょうか? そう i = 0 なので 0 ですね。
|
76
|
-
では arrayの長さは? array自体の長さは { "A", "B" } というデータなので 長さ 2 となる。
|
77
|
-
つまり、``i < array.length``は``0 < 2``となりますね。0 は 2 未満なので true。つまり(3.1)に潜る。
|
78
|
-
|
79
|
-
(3.1)で「変数 j を 0で初期化して宣言(毎回)」なのでさらにノートに j = 0 を追加。
|
80
|
-
|
81
|
-
```
|
82
|
-
array = { "A", "B" }
|
83
|
-
i = 0
|
84
|
-
j = 0
|
85
|
-
```
|
86
|
-
|
87
|
-
(3.2)で「do...whileの開始(whileの条件を満たしているときと初回時、行う)」ですから初回時は強制的に(3.2.1)に潜る。(3.2.1)では「jをインクリメント(つまり j = j + 1)」ですね。j の値はなんですか? そう、j = 0 なので 0ですね。つまり j = 0 + 1 = 1となり、1になる。よって j = 1 になるため、ノートに記録した j の値を更新します。
|
88
|
-
|
89
|
-
```
|
90
|
-
array = { "A", "B" }
|
91
|
-
i = 0
|
92
|
-
j = 1 // ← j の値を 0 から 1 に更新
|
93
|
-
```
|
94
|
-
|
95
|
-
(3.2)のブロック内の処理はここで終了しているので次の(3.3)へ。
|
96
|
-
|
97
|
-
(3.3)は「j が 現在位置の配列の長さ未満の間上記(3.2.1)を繰り返す」なので、``j < array[i].length``を満たすかどうかを調べる。j はなんでしたか? そう j = 1 なので 1 ですね。では array[i].lengthは?
|
98
|
-
|
99
|
-
今まで直接array[i].lengthなるものは出てきていませんが、これは「arrayの i 番目の長さ」です。
|
100
|
-
i はなんでしたっけ? そう i = 0 ですね。よって array[0].length です。
|
101
|
-
つまり『arrayの0番目の値の長さ』ですから、array[0]は "A" ですね。"A"の長さは1ですね。(文字数的に)
|
102
|
-
よって 1 < 1 を満たすかどうかがカギになります。1と1は同じ数字なので1 = 1 でないといけません。よって「満たさない」、つまりfalse。
|
103
|
-
そのため、do...whileの条件を満たさないためこのブロックは終了。
|
104
|
-
そして次のステップへ。
|
105
|
-
|
106
|
-
(3.4)で「現在位置の配列の値と j の値をそれぞれ出力」をして、(3.5)で「iをインクリメント」する。
|
107
|
-
i = 0 だったので i = 0 + 1 = 1 なので i = 1に更新。
|
108
|
-
|
109
|
-
```
|
110
|
-
array = { "A", "B" }
|
111
|
-
i = 1 // ← i の値を 0 から 1 に更新
|
112
|
-
j = 1
|
113
|
-
```
|
114
|
-
|
115
|
-
でも(3)はwhile文というループなので再度(3)に戻る。ただし、(3)の中で**宣言した j は破棄**されます。
|
116
|
-
|
117
|
-
よって、(3)に戻った時には
|
118
|
-
|
119
|
-
```
|
120
|
-
array = { "A", "B" }
|
121
|
-
i = 1
|
122
|
-
```
|
123
|
-
|
124
|
-
となります。(3)の条件式``i < array.length``を再度チェック。``1 < 2``となるので条件を満たします。よって(3.1)へ。
|
125
|
-
|
126
|
-
(3.1)では再度「 変数 j を 0で初期化して宣言(毎回)」するので
|
127
|
-
|
128
|
-
```
|
129
|
-
array = { "A", "B" }
|
130
|
-
i = 1
|
131
|
-
j = 0
|
132
|
-
```
|
133
|
-
|
134
|
-
となりますね。以後(3.5)まで同様に行い、(3)に戻る。
|
135
|
-
|
136
|
-
ただし、三回目の(3)では ``i < array.length`` は ``2 < 2``となりますので条件を満たさない。
|
137
|
-
よって(3)のブロック内の処理をしません。それ以降の処理はないのでここで終了となります。
|
138
|
-
|
139
|
-
結果、出力内容は
|
140
|
-
|
141
|
-
```
|
142
|
-
A:1
|
143
|
-
B:1
|
144
|
-
```
|
145
|
-
|
146
|
-
となります。
|
147
|
-
|
7
|
+
知りたい事
|
8
|
+
1.while(j < array[i].length())の意味
|
9
|
+
2.length()無視してarrary[i]だけをみていいのか(その場合の理由も知りたいです)
|