回答編集履歴

4

ループもう一つ

2016/11/18 01:39

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -29,6 +29,14 @@
29
29
  arrOption1.get(i)で"a"を取得、arrStrに"a"追加
30
30
 
31
31
  arrOption1 -> ["a", "b", "c", "a"] <- arrStr
32
+
33
+
34
+
35
+ i = 1
36
+
37
+ arrOption1.get(i)で"b"を取得、arrStrに"b"追加
38
+
39
+ arrOption1 -> ["a", "b", "c", "a", "b"] <- arrStr
32
40
 
33
41
 
34
42
 

3

無限ループ詳細

2016/11/18 01:39

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -1,3 +1,47 @@
1
+ おそらくですが、この問題の根幹は無限ループではないでしょうか?どういう現象が起きていて困っているのかそれを一切書いてくれないので推測ですが。
2
+
3
+ ```java
4
+
5
+ ArrayList<String> arrStr = arrOption1 ;
6
+
7
+ ```
8
+
9
+ この代入により、変数arrStrと変数arrOption1は**同じリスト**を参照します。これがnullでない場合、
10
+
11
+ ```java
12
+
13
+ for (int i = 0; i < arrOption1.size(); i++) {
14
+
15
+ arrStr.add(arrOption1.get(i));
16
+
17
+ }
18
+
19
+ ```
20
+
21
+ これが実行されます(閉じ括弧が足りなかったので追加)。例えばこれらのリストが["a", "b", "c"]という内容だとすると、
22
+
23
+
24
+
25
+ i = 0
26
+
27
+ arrOption1 -> ["a", "b", "c"] <- arrStr
28
+
29
+ arrOption1.get(i)で"a"を取得、arrStrに"a"追加
30
+
31
+ arrOption1 -> ["a", "b", "c", "a"] <- arrStr
32
+
33
+
34
+
35
+ という動作になり、以降同じような動作になります。継続条件である`i < arrOption1.size()`において、**arrOption1.size()が順次大きくなっていく**ため、いつまでたってもループから抜けることができません(※)。これが「上手く動作しない」の元凶ではないでしょうか?
36
+
37
+
38
+
39
+ (※)厳密には、ArrayList#size()はintの最大値(2^31-1)以上のサイズのリストに対して呼び出されるとintの最大値を返すので、iがそこまで到達すれば抜けることができる。
40
+
41
+ ###以前の回答
42
+
43
+
44
+
1
45
  「なくても動くようにしたい」なら、その引数にnullを渡す方法も考えられますが、その引数なしのメソッドをオーバーロードするという手もあります。
2
46
 
3
47
  つまり、今あるメソッドはそのままに、
@@ -31,7 +75,3 @@
31
75
  しかし現状のメソッドには問題があり、リストを回している間、arrStrというキーに結びつくオブジェクトが上書きされ続け、最後に記録したものしか残りません。キーとなる文字列も変化させてputExtraするか、いっそArrayListごとputExtraする必要があります。
32
76
 
33
77
 
34
-
35
- 今気づきましたが、これ無限ループになりますね。
36
-
37
- リストが持つ要素を繰り返し自分自身に加えているので、size()が際限なく増えていきます。

2

無限ループ

2016/11/18 01:37

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -29,3 +29,9 @@
29
29
 
30
30
 
31
31
  しかし現状のメソッドには問題があり、リストを回している間、arrStrというキーに結びつくオブジェクトが上書きされ続け、最後に記録したものしか残りません。キーとなる文字列も変化させてputExtraするか、いっそArrayListごとputExtraする必要があります。
32
+
33
+
34
+
35
+ 今気づきましたが、これ無限ループになりますね。
36
+
37
+ リストが持つ要素を繰り返し自分自身に加えているので、size()が際限なく増えていきます。

1

オーバーロード

2016/11/17 18:28

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -1,12 +1,24 @@
1
1
  「なくても動くようにしたい」なら、その引数にnullを渡す方法も考えられますが、その引数なしのメソッドをオーバーロードするという手もあります。
2
2
 
3
- つまり、今あるメソッドに加えて
3
+ つまり、今あるメソッドはそのまま
4
4
 
5
5
  ```java
6
6
 
7
7
  private void changeActivity(Class targetActivity, Integer record_id) {
8
8
 
9
9
  changeActivity(targetActivity, record_id, null, null);
10
+
11
+ }
12
+
13
+ private void changeActivity(Class targetActivity, Integer record_id, ArrayList<String> arrOption1) {
14
+
15
+ changeActivity(targetActivity, record_id, arrOption1, null);
16
+
17
+ }
18
+
19
+ private void changeActivity(Class targetActivity, Integer record_id, ArrayList<Integer> arrOption2) {
20
+
21
+ changeActivity(targetActivity, record_id, null, arrOption2);
10
22
 
11
23
  }
12
24