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

回答編集履歴

1

改めて回答

2017/05/28 12:47

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,1 +1,32 @@
1
- ヒント:continueの行き先は?
1
+ ヒント:continueの行き先は?
2
+
3
+ まずはコードをマークダウンしましょう。
4
+ ```java
5
+ int[] ans = new int[4];
6
+ for (int i = 0; i < ans.length; i++) {
7
+ while (true) {
8
+ ans[i] = (int) (Math.random() * 10);
9
+ for (int j = 0; j < i; j++) {
10
+ if (ans[i] == ans[j])
11
+ continue; // このcontinueが実行されたら次にどこに行く?
12
+ }
13
+ System.out.print(ans[i]);
14
+ break;
15
+ }
16
+ }
17
+ ```
18
+
19
+ ###答え
20
+ continueはその地点から見て**最も内側のループ文(for,while)**に戻り、次のループに入ります。
21
+ つまり、2行前の`for (int j = 0; j < i; j++)`に戻ります。
22
+ そしてこれはifに入ろうが入るまいが戻るので、**実質このif文とcontinue文は無くても同じです。**
23
+
24
+ このコードでやりたいのは、数字がダブったら数字の設定をやり直す、つまり`while(true)`に戻りたいのですよね?
25
+ なので、
26
+ 0. `while(true)`にラベルを付けて、ラベル付きcontinueにする(あまりお勧めされない)
27
+ 0. 数字が重複したかどうかのフラグを用意し、whileの継続条件をそのフラグの状態で判定する
28
+
29
+ のいずれかを取る必要があります。
30
+
31
+ また、このような重複を避けて選びたい場合、選ぶ候補を配列に用意してシャッフルし、先頭からいくつか(この場合4つ)選択するのが早くて確実です。
32
+ 配列のシャッフルは意外に簡単に実装できます。「シャッフル アルゴリズム」で検索してみてください。