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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

2192閲覧

入れ子Listの中身が同じになる

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/11/30 05:28

###前提・実現したいこと
自作APIからデータを取得し、その内容を入れ子Listに入れる処理を記述しています。
以下はそのリスト定義です。

java

1class Hoge{ 2 private int mParam; 3 private String mField; 4 //コンストラクタなど以下略 5} 6 7//Hoge型のクラスを持つFugaクラス 8class Fuga{ 9 private int mId; 10 private String mName; 11 private List<Hoge> mList; 12 13 //コンストラクタなど中略 14 public List<Hoge> getList(){ 15 return this.mList; 16 } 17 18 //以下略 19} 20 21//上記クラスを使ってListを定義したActivity 22public class HomeActivity extends AppCompatActivity{ 23 //中略 24 final List<Fuga> fugaList = new ArrayList<>(); 25 //以下略 26}

###発生している問題・エラーメッセージ
入れ子Listの中身が共通になり、参照しても同じデータが表示され、削除すると共通して削除され、何も残らなくなってしまいます。
もう少し具体的に申しますと、変数listに対してインデックスを指定してget()メソッドを実行しても、どのインデックスでもlist.get(index).getList()で同じ内容が表示されてしまいます。
Hoge・Fugaクラスでコンストラクタ、ゲッター・セッターは実装しておりますが、うまく行きません。

###該当のソースコード
このソースコードはActivityの中に実装されており、バックグラウンド処理される部分です。
今回質問させていただいた内容で関連のある部分のみを、一部変更して抜粋しております。

java

1//fugaListは、Activityのフィールドで以下のように定義しています 2final List<Fuga> fugaList = new ArrayList<>(); 3 4private void addDataToList(JSONObject object) { 5 6 String name,field; 7 int id,param; 8 9 try { 10 //WebAPIから取得したJSONデータをパースし、Listに格納する 11 JSONArray jsonArray = object.getJSONArray("history"); 12 for(int i = 0; i < jsonArray.length() ;i++) { 13 List<Hoge> hogeList = new ArrayList<>(); 14 JSONObject temp = (JSONObject) jsonArray.get(i); 15 name = temp.getString("name"); 16 idd = Integer.parseInt(temp.getString("machine")); 17 18 JSONArray jsonMeasureArray = temp.getJSONArray("measures"); 19 20 for(int j = 0; j < jsonMeasureArray.length(); j++){ 21 JSONObject w = (JSONObject) jsonMeasureArray.get(j); 22 param = Integer.parseInt(w.getString("param")); 23 field = String.valueOf(w.getString("field")); 24 hogeList.add(new Hoge(param,field)); 25 }//for 26 27 fugaList.add(new Huga(id,name,hogeList)); 28 }//for 29 }//try 30 //以下略 31 32}//adddataToList

###試したこと
リストのスコープをメソッド内に変更したり、set()で上書きしたり、clear()で初期化してもうまく行きません。

###補足情報
コンパイラ:Java 8
JVM実行環境:Android 5.0.1 Nexus 7
開発OS:Windows 10
IDE:Android Studio 3.0

初歩的な質問のことと思いますが、ご回答いただければ幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

見た限り、何も問題無いように思います。
下記の行にブレークポイントを設置しhogeListの値が妥当かを確認してください。

Java

1fugaList.add(new Huga(id,name,hogeList));

投稿2017/11/30 06:15

yona

総合スコア18155

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

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

退会済みユーザー

退会済みユーザー

2017/11/30 06:33

ご回答ありがとうございます。 自己解決内容に書いたとおり、WebAPIに問題があることが判明しました。Java側に問題がなかったと判明したことで、疑いを他にかけることができたことで進捗が捗りそうです。 この度はありがとうございました。また機会がありましたら、よろしくお願いいたします。
guest

0

ベストアンサー

閲覧頂きありがとうございます。

上記の質問ですが、yona様に頂いたご回答に従い、もう一度hogeListの中身を確認致しましたところ、やはり内容が同じでした。そこで疑いをWebAPIにかけたところ、WebAPIから返却されたデータが全て同一になっていたことが判明致しました。

いずれにしろ論理エラーですが、Javaの上では問題がないことが判明したのは進歩であると考えております。yona様に改めてお礼申し上げます。

投稿2017/11/30 06:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問