回答編集履歴
4
脱字修正
answer
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
```Java
|
88
88
|
public void asc() {
|
89
|
-
// iついて、要素数分ループ(先端から末端へ)
|
89
|
+
// iについて、要素数分ループ(先端から末端へ)
|
90
90
|
for (int i = 0; i < ary.length; i++) {
|
91
91
|
// jについて、同上
|
92
92
|
for (int j = 0; j < ary.length; j++) {
|
@@ -109,7 +109,7 @@
|
|
109
109
|
```pseudo
|
110
110
|
[疑似コード]
|
111
111
|
|
112
|
-
1. iついて、要素数分、以下をループ(先端から末端へ) ( i = 1, 2, 3, ... )
|
112
|
+
1. iについて、要素数分、以下をループ(先端から末端へ) ( i = 1, 2, 3, ... )
|
113
113
|
1.1. jについて、要素数分、以下をループ(先端から末端へ) ( j = 1, 2, 3, ... )
|
114
114
|
1.1.1. (j,j)の位置データと(i,i)の位置のデータを比較し、(j,j)が大きければ
|
115
115
|
1.1.1.1. 交換アルゴリズムによる交換
|
3
追記1.2
answer
CHANGED
@@ -132,4 +132,8 @@
|
|
132
132
|
|
133
133
|
101番目までしかないコインロッカーを『109番目から取り出して来い』と言われているようなものです。無理でしょ…
|
134
134
|
|
135
|
-
そもそも無理なので、「おーーーい、そんな場所ないぞ?」という例外が投げられているだけです。
|
135
|
+
そもそも無理なので、「おーーーい、そんな場所ないぞ?」という例外が投げられているだけです。
|
136
|
+
|
137
|
+
それと他の方も仰っているように、**デバッグしましょう**。
|
138
|
+
|
139
|
+
大雑把なやり方は上記での「コードを読む」と大体一緒です。単にデバッガを使うのか、いわゆるprintfデバッグでやるのか、コードのみでやるのかとかの違いだけです。
|
2
追記1.1
answer
CHANGED
@@ -78,4 +78,58 @@
|
|
78
78
|
|
79
79
|
さらに、今までに呼び出されたメソッドやコンストラクタ内も同様にやる。
|
80
80
|
|
81
|
+
コンストラクタはデフォルトのやつ(デフォルトコンストラクタ)のようなのでスルー。
|
82
|
+
|
83
|
+
getAryメソッドは名前通り、単にフィールドとして持っている配列を取得するだけ。getIdxメソッドは意味不明(名前と処理が合っていない)ですが、処理内容を見ると単に要素数を返しているだけですね。
|
84
|
+
|
85
|
+
なので ascメソッドを読んでみましょう。
|
86
|
+
|
87
|
+
```Java
|
88
|
+
public void asc() {
|
89
|
+
// iついて、要素数分ループ(先端から末端へ)
|
90
|
+
for (int i = 0; i < ary.length; i++) {
|
91
|
+
// jについて、同上
|
92
|
+
for (int j = 0; j < ary.length; j++) {
|
93
|
+
// (j,j)の位置データと(i,i)の位置のデータを比較し、(j,j)が大きければ
|
94
|
+
if ((int) ary[j].charAt(j) > (int) ary[i].charAt(i)) {
|
95
|
+
// 交換アルゴリズムによる交換
|
96
|
+
String tmp = ary[i];
|
97
|
+
ary[i] = ary[j];
|
98
|
+
ary[j] = tmp;
|
99
|
+
// メソッド終了!
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
105
|
+
```
|
106
|
+
|
107
|
+
これを**疑似コード**として書きだす。
|
108
|
+
|
81
|
-
|
109
|
+
```pseudo
|
110
|
+
[疑似コード]
|
111
|
+
|
112
|
+
1. iついて、要素数分、以下をループ(先端から末端へ) ( i = 1, 2, 3, ... )
|
113
|
+
1.1. jについて、要素数分、以下をループ(先端から末端へ) ( j = 1, 2, 3, ... )
|
114
|
+
1.1.1. (j,j)の位置データと(i,i)の位置のデータを比較し、(j,j)が大きければ
|
115
|
+
1.1.1.1. 交換アルゴリズムによる交換
|
116
|
+
1.1.1.2. メソッドの終了!
|
117
|
+
```
|
118
|
+
|
119
|
+
これを実際にシミュレーションしてみてください。実際にi,j,ary等にデータを入れて計算してみるとか。
|
120
|
+
|
121
|
+
そうすると、まず (1)で i = 0 となります。(1.1)では j = 0 となり、``i = 0, j = 0`` となる。
|
122
|
+
(1.1.1)で (0,0) と (0,0) を比較。つまり、Excelの表みたいに見て、0行0列のデータを比較するのです。
|
123
|
+
同じ場所を比較しているので大きいも小さいもありません。なので(1.1)に戻る。
|
124
|
+
|
125
|
+
(1.1)で j を進ませる。つまり、``i = 0, j = 1`` となる。そのまま(j,j) > (i,i)を比較。
|
126
|
+
|
127
|
+
(1,1) > (0,0) なのですが、対象となっている配列は``String[] ary = { "b", "a", "c" };``のようです。要素数はそれぞれ1で、配列は0番目から始まるので 0~(n-1)番目 までしかアクセスできません。
|
128
|
+
|
129
|
+
つまり、1行目は "a"ですが、1列目は無いです。'a' が 0番目なので。
|
130
|
+
|
131
|
+
そうなると、「んなもんねーよ!!!」となってしまいますね。
|
132
|
+
|
133
|
+
101番目までしかないコインロッカーを『109番目から取り出して来い』と言われているようなものです。無理でしょ…
|
134
|
+
|
135
|
+
そもそも無理なので、「おーーーい、そんな場所ないぞ?」という例外が投げられているだけです。
|
1
追記1
answer
CHANGED
@@ -29,8 +29,6 @@
|
|
29
29
|
|
30
30
|
つまり、『アクセスできないところを参照している』みたいな感じです。
|
31
31
|
|
32
|
-
コードが今のところ出されていないので説明は省きます。
|
33
|
-
|
34
32
|
```
|
35
33
|
[今後気をつけるべきこと]
|
36
34
|
|
@@ -39,4 +37,45 @@
|
|
39
37
|
3. 思考停止するな
|
40
38
|
4. 自分なりに調べよ
|
41
39
|
5. 試したことを書くべき
|
42
|
-
```
|
40
|
+
```
|
41
|
+
|
42
|
+
ーーー
|
43
|
+
[追記1]
|
44
|
+
|
45
|
+
当たり前でしょ…
|
46
|
+
|
47
|
+
そもそもプログラミングってのは『すでにあるコードを切り貼りして作ること』**ではありません**。
|
48
|
+
**ロジックを書く**のです。数学の証明を自力で考えるようなものです。
|
49
|
+
|
50
|
+
とりあえず、**コードを読みましょう**。
|
51
|
+
|
52
|
+
コードを読むコツは『**一行レベルで、その行が何をしているかを考えながら読む**』です。
|
53
|
+
|
54
|
+
まずはmainメソッドから読んでみましょう。
|
55
|
+
|
56
|
+
```Java
|
57
|
+
class Sample {
|
58
|
+
public static void main(String[] args) {
|
59
|
+
// Sortクラスをインスタンス化
|
60
|
+
Sort s = new Sort();
|
61
|
+
// 生成したオブジェクトのAACメソッドを呼び出す
|
62
|
+
s.asc();
|
63
|
+
// sが持つgetAryメソッドを呼び出す
|
64
|
+
s.getAry();
|
65
|
+
// iの初期値: 0, i が sのgetIdxメソッドが返すものより大きい間, 増加しながら繰り返す
|
66
|
+
for (int i = 0; i < s.getIdx(); i++) {
|
67
|
+
// sのgetAryメソッドを呼び出してその返ってきたやつのi番目にアクセスして出力
|
68
|
+
System.out.println(s.getAry()[i]);
|
69
|
+
}
|
70
|
+
}
|
71
|
+
}
|
72
|
+
```
|
73
|
+
|
74
|
+
これを手作業でやると考えてみてください。数学の手順とかでもいいです。とにかくシミュレーションしてください。
|
75
|
+
そうすると、三行目の『sが持つgetAryメソッドを呼び出す』がちょっと意味わかりませんね。
|
76
|
+
名前から察するに『オブジェクトが持つ配列を取得する』ってところでしょうけど、何も受け取っていません。
|
77
|
+
だったら呼び出す必要なくない?
|
78
|
+
|
79
|
+
さらに、今までに呼び出されたメソッドやコンストラクタ内も同様にやる。
|
80
|
+
|
81
|
+
続きは後で書きます。
|