回答編集履歴
4
脱字修正
test
CHANGED
@@ -174,7 +174,7 @@
|
|
174
174
|
|
175
175
|
public void asc() {
|
176
176
|
|
177
|
-
// iついて、要素数分ループ(先端から末端へ)
|
177
|
+
// iについて、要素数分ループ(先端から末端へ)
|
178
178
|
|
179
179
|
for (int i = 0; i < ary.length; i++) {
|
180
180
|
|
@@ -220,7 +220,7 @@
|
|
220
220
|
|
221
221
|
|
222
222
|
|
223
|
-
1. iついて、要素数分、以下をループ(先端から末端へ) ( i = 1, 2, 3, ... )
|
223
|
+
1. iについて、要素数分、以下をループ(先端から末端へ) ( i = 1, 2, 3, ... )
|
224
224
|
|
225
225
|
1.1. jについて、要素数分、以下をループ(先端から末端へ) ( j = 1, 2, 3, ... )
|
226
226
|
|
3
追記1.2
test
CHANGED
@@ -267,3 +267,11 @@
|
|
267
267
|
|
268
268
|
|
269
269
|
そもそも無理なので、「おーーーい、そんな場所ないぞ?」という例外が投げられているだけです。
|
270
|
+
|
271
|
+
|
272
|
+
|
273
|
+
それと他の方も仰っているように、**デバッグしましょう**。
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
大雑把なやり方は上記での「コードを読む」と大体一緒です。単にデバッガを使うのか、いわゆるprintfデバッグでやるのか、コードのみでやるのかとかの違いだけです。
|
2
追記1.1
test
CHANGED
@@ -158,4 +158,112 @@
|
|
158
158
|
|
159
159
|
|
160
160
|
|
161
|
+
コンストラクタはデフォルトのやつ(デフォルトコンストラクタ)のようなのでスルー。
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
getAryメソッドは名前通り、単にフィールドとして持っている配列を取得するだけ。getIdxメソッドは意味不明(名前と処理が合っていない)ですが、処理内容を見ると単に要素数を返しているだけですね。
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
なので ascメソッドを読んでみましょう。
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
```Java
|
174
|
+
|
175
|
+
public void asc() {
|
176
|
+
|
177
|
+
// iついて、要素数分ループ(先端から末端へ)
|
178
|
+
|
179
|
+
for (int i = 0; i < ary.length; i++) {
|
180
|
+
|
181
|
+
// jについて、同上
|
182
|
+
|
183
|
+
for (int j = 0; j < ary.length; j++) {
|
184
|
+
|
185
|
+
// (j,j)の位置データと(i,i)の位置のデータを比較し、(j,j)が大きければ
|
186
|
+
|
187
|
+
if ((int) ary[j].charAt(j) > (int) ary[i].charAt(i)) {
|
188
|
+
|
189
|
+
// 交換アルゴリズムによる交換
|
190
|
+
|
191
|
+
String tmp = ary[i];
|
192
|
+
|
193
|
+
ary[i] = ary[j];
|
194
|
+
|
195
|
+
ary[j] = tmp;
|
196
|
+
|
197
|
+
// メソッド終了!
|
198
|
+
|
199
|
+
return;
|
200
|
+
|
201
|
+
}
|
202
|
+
|
203
|
+
}
|
204
|
+
|
205
|
+
}
|
206
|
+
|
207
|
+
}
|
208
|
+
|
209
|
+
```
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
これを**疑似コード**として書きだす。
|
214
|
+
|
215
|
+
|
216
|
+
|
161
|
-
|
217
|
+
```pseudo
|
218
|
+
|
219
|
+
[疑似コード]
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
1. iついて、要素数分、以下をループ(先端から末端へ) ( i = 1, 2, 3, ... )
|
224
|
+
|
225
|
+
1.1. jについて、要素数分、以下をループ(先端から末端へ) ( j = 1, 2, 3, ... )
|
226
|
+
|
227
|
+
1.1.1. (j,j)の位置データと(i,i)の位置のデータを比較し、(j,j)が大きければ
|
228
|
+
|
229
|
+
1.1.1.1. 交換アルゴリズムによる交換
|
230
|
+
|
231
|
+
1.1.1.2. メソッドの終了!
|
232
|
+
|
233
|
+
```
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
これを実際にシミュレーションしてみてください。実際にi,j,ary等にデータを入れて計算してみるとか。
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
そうすると、まず (1)で i = 0 となります。(1.1)では j = 0 となり、``i = 0, j = 0`` となる。
|
242
|
+
|
243
|
+
(1.1.1)で (0,0) と (0,0) を比較。つまり、Excelの表みたいに見て、0行0列のデータを比較するのです。
|
244
|
+
|
245
|
+
同じ場所を比較しているので大きいも小さいもありません。なので(1.1)に戻る。
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
(1.1)で j を進ませる。つまり、``i = 0, j = 1`` となる。そのまま(j,j) > (i,i)を比較。
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
(1,1) > (0,0) なのですが、対象となっている配列は``String[] ary = { "b", "a", "c" };``のようです。要素数はそれぞれ1で、配列は0番目から始まるので 0~(n-1)番目 までしかアクセスできません。
|
254
|
+
|
255
|
+
|
256
|
+
|
257
|
+
つまり、1行目は "a"ですが、1列目は無いです。'a' が 0番目なので。
|
258
|
+
|
259
|
+
|
260
|
+
|
261
|
+
そうなると、「んなもんねーよ!!!」となってしまいますね。
|
262
|
+
|
263
|
+
|
264
|
+
|
265
|
+
101番目までしかないコインロッカーを『109番目から取り出して来い』と言われているようなものです。無理でしょ…
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
そもそも無理なので、「おーーーい、そんな場所ないぞ?」という例外が投げられているだけです。
|
1
追記1
test
CHANGED
@@ -60,10 +60,6 @@
|
|
60
60
|
|
61
61
|
|
62
62
|
|
63
|
-
コードが今のところ出されていないので説明は省きます。
|
64
|
-
|
65
|
-
|
66
|
-
|
67
63
|
```
|
68
64
|
|
69
65
|
[今後気をつけるべきこと]
|
@@ -81,3 +77,85 @@
|
|
81
77
|
5. 試したことを書くべき
|
82
78
|
|
83
79
|
```
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
ーーー
|
84
|
+
|
85
|
+
[追記1]
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
当たり前でしょ…
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
そもそもプログラミングってのは『すでにあるコードを切り貼りして作ること』**ではありません**。
|
94
|
+
|
95
|
+
**ロジックを書く**のです。数学の証明を自力で考えるようなものです。
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
とりあえず、**コードを読みましょう**。
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
コードを読むコツは『**一行レベルで、その行が何をしているかを考えながら読む**』です。
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
まずはmainメソッドから読んでみましょう。
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
```Java
|
112
|
+
|
113
|
+
class Sample {
|
114
|
+
|
115
|
+
public static void main(String[] args) {
|
116
|
+
|
117
|
+
// Sortクラスをインスタンス化
|
118
|
+
|
119
|
+
Sort s = new Sort();
|
120
|
+
|
121
|
+
// 生成したオブジェクトのAACメソッドを呼び出す
|
122
|
+
|
123
|
+
s.asc();
|
124
|
+
|
125
|
+
// sが持つgetAryメソッドを呼び出す
|
126
|
+
|
127
|
+
s.getAry();
|
128
|
+
|
129
|
+
// iの初期値: 0, i が sのgetIdxメソッドが返すものより大きい間, 増加しながら繰り返す
|
130
|
+
|
131
|
+
for (int i = 0; i < s.getIdx(); i++) {
|
132
|
+
|
133
|
+
// sのgetAryメソッドを呼び出してその返ってきたやつのi番目にアクセスして出力
|
134
|
+
|
135
|
+
System.out.println(s.getAry()[i]);
|
136
|
+
|
137
|
+
}
|
138
|
+
|
139
|
+
}
|
140
|
+
|
141
|
+
}
|
142
|
+
|
143
|
+
```
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
これを手作業でやると考えてみてください。数学の手順とかでもいいです。とにかくシミュレーションしてください。
|
148
|
+
|
149
|
+
そうすると、三行目の『sが持つgetAryメソッドを呼び出す』がちょっと意味わかりませんね。
|
150
|
+
|
151
|
+
名前から察するに『オブジェクトが持つ配列を取得する』ってところでしょうけど、何も受け取っていません。
|
152
|
+
|
153
|
+
だったら呼び出す必要なくない?
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
さらに、今までに呼び出されたメソッドやコンストラクタ内も同様にやる。
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
続きは後で書きます。
|