ArrayList
のArrayLists
(ArrayList<ArrayList<Element>>
)を含むアプリケーションがあります。基本的に、各要素はユーザーが対話できる項目です。要素が対話するたびに、その要素が更新され、コンテナオブジェクト全体がファイルシステムに再格納されます。要素の1つのタイプ(extends要素)は、要素タイトル、真または偽の値、および他のいくつかの一般的なパラメータを含むことができるEBoolean
です。 updateBoolean
メソッドが呼び出されると、タブ、ID、ブール値が渡されます。このメソッドは、正しい要素(一致するID)をスキャンし、その値を更新します。しかし、私はいくつかの奇妙な動作が発生している、1つの要素を変更すると、配列全体のすべての要素が変更されます。ArrayListの問題:1つの値すべての値をリセットする
はここ/出力ワットコードです:
public void updateBoolean(int index, int ID, boolean b) {
// Data that is gonna be saved
System.out.println("Statistics: Index: "+index+" Array # "+elements.size()+" Elements in array #: "+elements.get(index).size());
for (int i = 1; i < elements.size(); i++) {
System.out.println("TAB " + i + " Title: " + elements.get(i).get(0).getTitle() + "Boolean value: " + ((EBoolean) elements.get(i).get(0)).getValue());
}
for (int j = 0; j < elements.get(index).size(); j++) {
if (elements.get(index).get(j).getID() == ID) {
EBoolean ent = (EBoolean) elements.get(index).get(0);
ent.setValue(b);
ent.setModified(true);
elements.get(index).set(j, ent);
System.out.println("Updated booleans, here's what we have now: ");
for (int i = 1; i < elements.size(); i++) {
System.out.println("TAB " + i + " Title: " + elements.get(i).get(0).getTitle() + "Boolean value: " + ((EBoolean) elements.get(i).get(0)).getValue());
}
return;
}
}
}
出力:配列に追加するとき
04-02 16:01:05.441 15442-15442/? I/System.out: Statistics: Index: 4 Array # 13 Elements in array #: 4
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 1 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 2 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 3 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 4 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 5 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 6 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 7 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 8 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 9 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 10 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 11 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 12 Title: BooleanBoolean value: false
04-02 16:01:05.441 15442-15442/? I/System.out: Updated booleans, here's what we have now:
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 1 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 2 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 3 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 4 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 5 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 6 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 7 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 8 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 9 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 10 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 11 Title: BooleanBoolean value: true
04-02 16:01:05.441 15442-15442/? I/System.out: TAB 12 Title: BooleanBoolean value: true
'elements.get(index).get(0)'から 'EBoolean'を取得し、' elements.get(index).set(j、ent) 'に格納するのはなぜですか?また、どのように 'EBoolean'を作成していますか?更新するインスタンスごとに新しいインスタンスを作成しないと、実際にはすべてのインスタンスが更新されます。インデックス0を持つ 'EBoolean'は、そこから取り出して変更すると更新されます。これにより、 'EBoolean'の同じインスタンスが' 0'と 'j'の位置にあり、どちらかを変更すると、' EBoolean'の同じインスタンスであるため、どちらか一方を変更することになります。 – Leon
@Leon回答インスタンスに基づいて、最初のタブの最初の出力値と同じではなく、それ以外の場合はfalseです。 –
'elements.get(index).get(0)'と 'elements.get(index).set(j、ent)'はテストのためのものでした。通常は@Leonのコードを1行だけ使用します – wdavies973