回答編集履歴

4

脱字修正

2021/12/27 00:21

投稿

BeatStar
BeatStar

スコア4962

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

2021/12/27 00:21

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -267,3 +267,11 @@
267
267
 
268
268
 
269
269
  そもそも無理なので、「おーーーい、そんな場所ないぞ?」という例外が投げられているだけです。
270
+
271
+
272
+
273
+ それと他の方も仰っているように、**デバッグしましょう**。
274
+
275
+
276
+
277
+ 大雑把なやり方は上記での「コードを読む」と大体一緒です。単にデバッガを使うのか、いわゆるprintfデバッグでやるのか、コードのみでやるのかとかの違いだけです。

2

追記1.1

2021/12/26 07:48

投稿

BeatStar
BeatStar

スコア4962

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

2021/12/26 07:45

投稿

BeatStar
BeatStar

スコア4962

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
+ 続きは後で書きます。