2

リストからデータを取得できません。値が保存されていないように見えるか、オブジェクトが初期化されていますか? いくつかの変数を格納するクラスを作成しました。

public class storage{
     public int a = 0;
     public int b = 0;
}

次に、aとbにいくつかの値を入力し、オブジェクトをリストに格納する別のクラスを作成しました

public class anotherclass{
      public List<storage> alldata = new ArrayList<storage>();

      public void filldata(){
            storage tmp = new storage();
            for (int i = 1; i <= 10; i++){
                 tmp.a = i;
                 tmp.b = i;
                 alldata.add(tmp);
            }
      }
}

しかし、メイン クラスで filldata() を実行すると、リストからオブジェクトを取得しようとすると、a と b はまだ 0 に設定されています。

public static void main(String[] args){
    anotherclass obj = new anotherclass();
    obj.filldata()

    for (int i = 0; i <= obj.alldata.size() - 1; i++){
          System.out.println(obj.alldata.get(i).a)
          System.out.println(obj.alldata.get(i).b)
          //Outputs as all zeroes
    }

}

これはどうやってできるの?

4

5 に答える 5

7

毎回オブジェクトを作成してみてください。それ以外の場合は、同じオブジェクトを使用します。したがって、それだけではリストに追加されません。

            storage tmp = null;
            for (int i = 1; i <= 10; i++)
            {
                 tmp = new storage();
                 tmp.a = i;
                 tmp.b = i;
                 alldata.add(tmp);
            }

それ以外の

            storage tmp = new storage();
            for (int i = 1; i <= 10; i++)
            {
                 tmp.a = i;
                 tmp.b = i;
                 alldata.add(tmp);
            }
于 2013-10-11T03:56:17.177 に答える
2

以下の行は、メソッドのforループ内にある必要があります。filldata()

storage tmp = new storage();

リストに追加する新しいオブジェクトを作成する必要があるたびに。あなたの場合、同じオブジェクトが新しい値でオーバーライドされています。

また、mainメソッドの構文が間違っています。そのはず

public static void main(String[] args)

補足: IDE からエラーのあるコードをそのままコピーして貼り付けます。ここには入力しないでください。コードには非常に多くのコンパイルの問題があります (構文ミス、セミコロンの欠落など)。私がこれを言っている理由は、私が言及した解決策が、*0* ではなくすべての *10* を出力として取得する場合のためのものだからです。*0* が表示される場合、投稿したコードはその問題を引き起こしているものではありません。

于 2013-10-11T03:57:08.810 に答える
1

filldata() メソッドにポインターの欠陥があります。オブジェクト tmp を 1 つだけ作成し、同じオブジェクトをリスト全体に追加しました。リスト内のすべてのエントリが同じオブジェクトを指しています。問題を解決するには、エントリごとに新しいオブジェクトを作成することから始めてください。

filldata() を次のように置き換えます。

public void filldata(){
        storage tmp;
        for (int i = 1; i <= 10; i++){
             tmp = new storage();
             tmp.a = i;
             tmp.b = i;
             alldata.add(tmp);
        }
  }
于 2013-10-11T04:01:43.207 に答える
0

エラーであるすべての10(あなたが言うように0ではありません)を出力するプログラムは次のとおりです。@newuser からの回答に従って変更します

import java.util.*;

class storage{
     public int a = 0;
     public int b = 0;
}

public class anotherclass{
      public List<storage> alldata = new ArrayList<storage>();

      public void filldata(){
            storage tmp = new storage();
            for (int i = 1; i <= 10; i++){
                 tmp.a = i;
                 tmp.b = i;
                 alldata.add(tmp);
            }
      }

public static void main(String[] args){
    anotherclass obj = new anotherclass();
    obj.filldata();

    for (int i = 0; i <= obj.alldata.size() - 1; i++){
          System.out.println(obj.alldata.get(i).a);
          System.out.println(obj.alldata.get(i).b);

    }

}

}
于 2013-10-11T03:59:40.230 に答える
0

上記のコードでも内部クラスの静的参照エラーが発生しています。以下の例では、新しいオブジェクトを作成し、反復ごとに新しい a 値と b値を取るループを使用new storage();しています。for

import java.util.ArrayList;
import java.util.List;

public class StackClass {

class Storage {

    public int a = 0;
    public int b = 0;
}

public class AnotherClass {

    public List<Storage> allData = new ArrayList<Storage>();

    public void fillData() {

        for (int i = 1; i <= 10; i++) {
            Storage tmp = new Storage();
            tmp.a = i;
            tmp.b = i;
            allData.add(tmp);
        }
    }
}

public static void main(String[] args) {

    StackClass stack = new StackClass();
    AnotherClass obj = stack.new AnotherClass();        

    obj.fillData();

    for (int i = 0; i <= obj.allData.size() - 1; i++) {
        System.out.println("Objec[" + i + "].a-" + obj.allData.get(i).a);
        System.out.println("Objec[" + i + "].b-" + obj.allData.get(i).b);

    }
}
}
于 2013-10-11T04:36:28.950 に答える