質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1440閲覧

methodがうまく作れない

earnest_gay

総合スコア615

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/17 17:22

独自メソッドを作っていますが、ifを使っているせいかうまく動作しません。

何かしらのアクションをした時に
渡したいデータをintentにセットし遷移するための関数です。

第一引数:遷移先アクティビティ,(必須)
第二引数:record_id,(必須)
第三引数:String型の配列,(なくても動くようにしたい)
第四引数:Integer型の配列(なくても動くようにしたい)

どうしたら良いでしょうか?
JAVAはあまりやったことがないので、、、知恵をお貸しください。

java

1 //第一引数:遷移先アクティビティ,第二引数:record_id,第三引数:String型の配列,第四引数:Integer型の配列 2 private void changeActivity(Class targetActivity, Integer record_id,ArrayList<String> arrOption1,ArrayList<Integer> arrOption2) { 3 Intent intent = new Intent(this, targetActivity.class); 4 intent.putExtra("record_id", record_id); 5 6 ArrayList<String> arrStr = arrOption1 ; 7 if(arrOption1 != null){ 8 for (int i = 0; i < arrOption1.size(); i++) { 9 arrStr.add(arrOption1.get(i); 10 } 11 for (int i = 0; i < arrStr.size(); i++) { 12 intent.putExtra("arrStr", arrStr.get(i)); 13 } 14 } 15 16 ArrayList<Integer> arrInt = arrOption2 ; 17 if(arrOption2 != null){ 18 for (int i = 0; i < arrOption2.size(); i++) { 19 arrInt.add(arrOption2.get(i); 20 } 21 for (int i = 0; i < arrInt.size(); i++) { 22 intent.putExtra("arrStr", arrInt.get(i)); 23 } 24 } 25 startActivity(intent); 26 } 27

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

うまく動きませんじゃわかりません。
想定している動作と、現状の動作で異なることを具体的に書かないと質問になりません。

リファレンスを読んでいますか?
Intent#putStringArrayListExtraやIntent#putIntegerArrayListExtraを使ってください。
また、キーが重複するとセットした値が上書きされます。

投稿2016/11/17 17:37

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

changeActivity(target, id)のように第三パラメーター以降を省略可能にしたいということでしょうか。
他の言語ではメソッドを一つだけ定義していくつかのパラメーターを省略したり名前で指定という言語仕様を持っているものもありますね。javaではそうした仕様がありませんので異なる引数のメソッドとしてオーバーロードするほかは手がありません。定義が若干面倒ですが、こうすることで呼び出しの際に引数を省略した記述が可能です。

java

1// 基本のメソッド(引数の省略なしバージョン) 2void ca1(A req1, B req2, ArrayList<String> opt1, ArrayList<Integer> opt2) { 3 ... 4} 5// オーバーロード(opt2を省略可能にしたバージョン) 6void ca1(A req1, B req2, ArrayList<String> opt1) { 7 ca1(req1, req2, opt1, null); 8} 9// オーバーロード(opt1, opt2を省略可能にしたバージョン) 10void ca1(A req1, B req2) { 11 ca1(req1, req2, null); // ca1(req1, req2, null, null);とも書ける 12} 13// 必要なだけオーバーロードを定義する 14...

投稿2016/11/17 17:56

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

おそらくですが、この問題の根幹は無限ループではないでしょうか?どういう現象が起きていて困っているのかそれを一切書いてくれないので推測ですが。

java

1ArrayList<String> arrStr = arrOption1 ;

この代入により、変数arrStrと変数arrOption1は同じリストを参照します。これがnullでない場合、

java

1for (int i = 0; i < arrOption1.size(); i++) { 2 arrStr.add(arrOption1.get(i)); 3}

これが実行されます(閉じ括弧が足りなかったので追加)。例えばこれらのリストが["a", "b", "c"]という内容だとすると、

i = 0
arrOption1 -> ["a", "b", "c"] <- arrStr
arrOption1.get(i)で"a"を取得、arrStrに"a"追加
arrOption1 -> ["a", "b", "c", "a"] <- arrStr

i = 1
arrOption1.get(i)で"b"を取得、arrStrに"b"追加
arrOption1 -> ["a", "b", "c", "a", "b"] <- arrStr

という動作になり、以降同じような動作になります。継続条件であるi < arrOption1.size()において、arrOption1.size()が順次大きくなっていくため、いつまでたってもループから抜けることができません(※)。これが「上手く動作しない」の元凶ではないでしょうか?

(※)厳密には、ArrayList#size()はintの最大値(2^31-1)以上のサイズのリストに対して呼び出されるとintの最大値を返すので、iがそこまで到達すれば抜けることができる。
###以前の回答

「なくても動くようにしたい」なら、その引数にnullを渡す方法も考えられますが、その引数なしのメソッドをオーバーロードするという手もあります。
つまり、今あるメソッドはそのままに、

java

1private void changeActivity(Class targetActivity, Integer record_id) { 2 changeActivity(targetActivity, record_id, null, null); 3} 4private void changeActivity(Class targetActivity, Integer record_id, ArrayList<String> arrOption1) { 5 changeActivity(targetActivity, record_id, arrOption1, null); 6} 7private void changeActivity(Class targetActivity, Integer record_id, ArrayList<Integer> arrOption2) { 8 changeActivity(targetActivity, record_id, null, arrOption2); 9}

というメソッドを加えます。

しかし現状のメソッドには問題があり、リストを回している間、arrStrというキーに結びつくオブジェクトが上書きされ続け、最後に記録したものしか残りません。キーとなる文字列も変化させてputExtraするか、いっそArrayListごとputExtraする必要があります。

投稿2016/11/17 17:37

編集2016/11/18 01:39
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/11/18 17:40

ありがとうございます! 確か読んだ本に似たようなこと書いてました。 public String test(String str) { return str; } public Integer test(Integer num) { return num; } 型の自動変換でしたかね、、、 発想としては似たようなところでしょうか。 作ってみます。
swordone

2016/11/18 17:51

他の質問もそうですが、余りに基礎がたりなさすぎます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問