2016-07-21 6 views
0

私は配列のループ内の要素を割り当てている間に問題は起こりません。java配列のループの問題

ループから外れてチェックすると、すべてのインデックスの同じ配列値が最後のインデックスの配列値に設定されます。 iはループの値が適切に示されている基本的にあるinside_loopを印刷するとき、次のコード

JSONObject js = new JSONObject(json_string); 
    JSONArray jsonArray=js.getJSONArray("customer"); 
    DataModelCollection[] dataModelCollection = new DataModelCollection[7]; 

for (int i=0;i<jsonArray.length();i++) { 

    JSONObject json = jsonArray.getJSONObject(i); 

    amont = json.getLong("BalanceAmount"); 
    custName = json.getString("CustName"); 
    partitionKey = json.getInt("PartitionKey"); 
    String date1 = json.getString("date"); 

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    Date date = df.parse(date1); 

    dataModelCollection[i] = new DataModelCollection(); 

    dataModelCollection[i].setName(custName); 
    dataModelCollection[i].setAccountNo(partitionKey); 
    dataModelCollection[i].setAmount(amont); 
    dataModelCollection[i].setCollectedDate(date); 


    Log.i("inside_loop", ""+dataModelCollection[i].getName()); 

    } 

    Log.i("outside_loop", ""+dataModelCollection[0].getName()); 
    Log.i("outside_loop", ""+dataModelCollection[1].getName()); 
    Log.i("outside_loop", ""+dataModelCollection[2].getName()); 
    Log.i("outside_loop", ""+dataModelCollection[3].getName()); 
    Log.i("outside_loop", ""+dataModelCollection[4].getName()); 
    Log.i("outside_loop", ""+dataModelCollection[5].getName()); 
    Log.i("outside_loop", ""+dataModelCollection[6].getName()); 

あります。実行が終了し、 "outside_loop"をチェックすると、すべてのインデックスの値がdataModelCollection [6] .getName() - 最後のインデックスの値になります。 amount,date,partitionKeyの場合も同様です。

どこが間違っているのか分かりません。何でもその価値について

ここDataModelCollectionモーダルクラスです:

public class DataModelCollection { 

public static long accountNo; 
public static String name; 
public static double amount; 
public static Date collectedDate; 

public DataModelCollection(long accountNo, String name, double amount, Date collectedDate) { 
    this.accountNo = accountNo; 
    this.name = name; 
    this.amount = amount; 
    this.collectedDate = collectedDate; 
} 

public DataModelCollection() { 

} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public double getAmount() { 
    return amount; 
} 

public void setAmount(double amount) { 
    this.amount = amount; 
} 

public Date getCollectedDate() { 
    return collectedDate; 
} 

public void setCollectedDate(Date collectedDate) { 
    this.collectedDate = collectedDate; 
} 

public long getAccountNo() { 
    return accountNo; 
} 

public void setAccountNo(long accountNo) { 
    this.accountNo = accountNo; 
} 

私はこのような状況を引き起こしているかの本当に無知です。助けてください。

+3

'static'キーワードは何をしていますか? – resueman

答えて

1

あなたはこれらのそれぞれからキーワードstaticを削除する必要があります。 setterとgetterを使ってこれらの値を変更しているので、publicからprivateに変更することもできます。 staticが変数classではなく、インスタンス「オブジェクト」に属することを意味するので、それらすべてが最後に設定された値となっ

public static long accountNo; 
public static String name; 
public static double amount; 
public static Date collectedDate; 

private long accountNo; 
private String name; 
private double amount; 
private Date collectedDate; 

に理由があります。だから、 dataModelCollection[i] = new DataModelCollection();で新しいオブジェクトを作成していても、静的変数を変更すると、すべての DataModelCollectionオブジェクトに影響します。静的/インスタンス hereの詳細

2
public static long accountNo; 
public static String name; 
public static double amount; 
public static Date collectedDate; 

これらは静的変数ではなくインスタンス変数である必要があります。

キーワードstaticを削除してください。これは必要に応じて動作します。

In laymans terms, what does 'static' mean in Java?

1

DataModelCollectionクラスの属性は静的です! これは、クラスのすべてのインスタンスに共通することを意味します。 ループは、すべてのインスタンスに共通するたびに、静的変数の値を変更するだけです。

1

私はあなたにいくつかの魔法を教えさせてください!

は、クラス DataModelCollectionで宣言した変数にキーワード 静的を削除し、あなたのコードが正常に動作します。