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

回答編集履歴

4

ループもう一つ

2016/11/18 01:39

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -15,6 +15,10 @@
15
15
  arrOption1.get(i)で"a"を取得、arrStrに"a"追加
16
16
  arrOption1 -> ["a", "b", "c", "a"] <- arrStr
17
17
 
18
+ i = 1
19
+ arrOption1.get(i)で"b"を取得、arrStrに"b"追加
20
+ arrOption1 -> ["a", "b", "c", "a", "b"] <- arrStr
21
+
18
22
  という動作になり、以降同じような動作になります。継続条件である`i < arrOption1.size()`において、**arrOption1.size()が順次大きくなっていく**ため、いつまでたってもループから抜けることができません(※)。これが「上手く動作しない」の元凶ではないでしょうか?
19
23
 
20
24
  (※)厳密には、ArrayList#size()はintの最大値(2^31-1)以上のサイズのリストに対して呼び出されるとintの最大値を返すので、iがそこまで到達すれば抜けることができる。

3

無限ループ詳細

2016/11/18 01:39

投稿

swordone
swordone

スコア20675

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

2

無限ループ

2016/11/18 01:37

投稿

swordone
swordone

スコア20675

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

1

オーバーロード

2016/11/17 18:28

投稿

swordone
swordone

スコア20675

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