teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

脱字修正

2021/12/27 00:21

投稿

BeatStar
BeatStar

スコア4962

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

2021/12/27 00:21

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -132,4 +132,8 @@
132
132
 
133
133
  101番目までしかないコインロッカーを『109番目から取り出して来い』と言われているようなものです。無理でしょ…
134
134
 
135
- そもそも無理なので、「おーーーい、そんな場所ないぞ?」という例外が投げられているだけです。
135
+ そもそも無理なので、「おーーーい、そんな場所ないぞ?」という例外が投げられているだけです。
136
+
137
+ それと他の方も仰っているように、**デバッグしましょう**。
138
+
139
+ 大雑把なやり方は上記での「コードを読む」と大体一緒です。単にデバッガを使うのか、いわゆるprintfデバッグでやるのか、コードのみでやるのかとかの違いだけです。

2

追記1.1

2021/12/26 07:48

投稿

BeatStar
BeatStar

スコア4962

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

2021/12/26 07:45

投稿

BeatStar
BeatStar

スコア4962

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