使用Arraylist addAll()创建一个包含不同引用的新对象的新列表

时间:2013-10-12 18:59:12

标签: java arraylist

我想将两个arraylists合并为一个新的arraylist,并遍历列表。在我对新的arraylist进行操作之前,我希望将某些值乘以-1。但问题是,当使用addAll()时,我也会使用旧的arraylist。

public Polynoom subtract (Polynoom that) {
    Polynoom subtract = new Polynoom(); 
    subtract.termen.addAll(that.termen);
    for (int i = 0; i < subtract.termen.size(); i++) {
        subtract.termen.get(i).coef = subtract.termen.get(i).coef * -1; 
    }
    subtract.termen.addAll(this.termen);
    Collections.sort(subtract.termen);
    subtract.removeDoubles(); 
    return subtract; 

}

我的Polynoom类看起来像这样:

   class Polynoom implements PolynoomInterface {


        ArrayList<Paar> termen = new ArrayList<Paar>(); 

        Polynoom() {
            termen = new ArrayList<Paar>();
        }
}

问题是(我认为):当使用addAll()时,它会创建REFERENCES而不是新副本,因此更改元素将同时更改两者。什么是克服这个问题的好方法?

我当然可以创建一个新的一对而不是一个Polynoom,并将这一对添加到一个新的Polynoom,但我不认为这是非常好的代码。有人有更好的主意吗?

2 个答案:

答案 0 :(得分:1)

试试这个

subtract.termen = new ArrayList<Paar>(that.termen);
在循环之前

并删除subract.termen.addall();

或者你可以创建新对象

ArrayList <Paar> temp = new ArrayList<Paar>(that.termen);
subtract.termen.addAll(temp);

答案 1 :(得分:0)

首先,您可以使用更好的方法进行迭代:

    for (Paar par : substract.termen){
        par.coef *= -1;
    }

如果你想要很好的方法,你的方法应该是这样的:

public Polynoom subtract(Polynoom that) {
    Polynoom subtract = this.clone(); //Creates same Polynom, you have to create this method
    //Polynoom subtract = new Polynoom(this) => the same as line above using constructor
    for (Paar par : that.termen){
        substract.sub(par));
    }
    return subtract;
}

所以你必须添加函数public Paar sub(Paar that),它只从你的多项式中减去一个Paar。它应该是这样的:

public void sub(Paar that){
    Paar paar = new Paar(that.coef);
    if (this.existsPaarWithSameCoef()){
        paar.multipliedBy -= this.findsPaarWithSameCoef().multipliedBy;
    } else {
        paar.multipliedBy *= -1;
    }
    return paar;
}