0

Java コレクションについて質問があります。Java コレクションを反復処理し、if 節が true の場合、コレクションのエントリを変更したいと考えています。if-clause 本体内で新しい値が受け入れられますが、後でコレクション全体を印刷したい場合は、古い値でコレクションを再度印刷します。

ここにコード:

public boolean checkConsumeStorageCapacity(Multimap<String, Values> mm1,   Multimap<String, Values> mm2)
{
    boolean enoughStorageCapacity = false;

     Multimap<String, Values> mmApp = mm1;

     Multimap<String, Values> mmHW = mm2;

     Collection<Values> colA = mmApp.get("Storage");
     Collection<Values> colH = mmHW.get("Memory");
for (Values vA2 : colA) {
    for (Values vH2 : colH) {

        if (vA2.getName().equals("Size") && vH2.getName().equals("Size")) {

            float StoSize = Float.parseFloat(vA2.getValue());
            float MemSize = Float.parseFloat(vH2.getValue());
            float maintainableStoSize = StoSize * maintainabilityfactor;

            if (MemSize >= maintainableStoSize) {

                MemSize -= maintainableStoSize;
                vH2.setValue(String.valueOf(MemSize));

                String s = vH2.getValue();
                System.out.println(s);

                enoughStorageCapacity = true;
                return enoughStorageCapacity;

            }
            break;
        }

    }
}

System.out.println(colH);

Values は 3 つの文字列を含むオブジェクトです。ゲッター/セッターはすべて正しく宣言されています。s を出力すると正しい値が得られますが、colH を出力すると古い値が返されます。新しい値を設定するだけでは十分ではありません。さらに、コレクションに何かをコミットする必要がありますか?

よろしくお願いします。

編集:さらに理解するために、ここではvaluesクラス。

public class Values {

private String name;
 private String type;
 private String value;

public Values(String name, String type, String value)
 {
    this.name = name; 
    this.type = type; 
    this.value = value;
}
public String getName()
 {
    return name;
 }
public String getType()
 {
    return type;
 }
public String getValue()
 {
    return value;
 }
public void setName(String name)
{
    this.name = name; 
}
public void setValue(String value)
{
    this.value = value; 
}
public void setType(String type)
{
    this.type = type; 
}

@Override
public String toString() {
    return "name=" + name + ", type=" + type + ", value=" + value;
    }

}
4

1 に答える 1

4

このようなポインターの問題に対処する別の方法は、ループの前に 2 番目のコレクションを初期化することです。繰り返しながら、同じままにしたい値をコレクションに追加し、if ステートメントで変更された値/オブジェクトを追加します。これには少し多くのメモリが必要ですが、実際のパフォーマンスの低下はありません

このようなもの:

list<T> originallist;
list<T> tmp = new list
for(x : originalList)
{
if(condition)
{
//do things
tmp.add(changedValue)
}
else
{
 tmp.add(x)
 }
}
于 2013-10-07T14:07:43.847 に答える