我想将两个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,但我不认为这是非常好的代码。有人有更好的主意吗?
答案 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;
}