回答編集履歴

1

改めて回答

2017/05/28 12:47

投稿

swordone
swordone

スコア20669

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