在java中使用以下代码
public Polynomial multiply(Polynomial aPolynomial){
Polynomial ret = new Polynomial();
for (Tuple i: this.pol){
Polynomial temp = aPolynomial.clone();
System.out.print(temp);
for (Tuple j: temp.pol){
j.setCoef(j.getCoef() * i.getCoef());
j.setPower(j.getPower() + i.getPower());
}
ret = ret.add(temp).clone();
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出System.out.print(temp)总是不同的值.这意味着aPolynomial在运行时期间某处改变了get.
更改Polynomial temp = aPolynomial.clone();到:
LinkedList<Tuple> list1 = (LinkedList<Tuple>) aPolynomial.pol.clone();
Polynomial temp = new Polynomial(list1);
Run Code Online (Sandbox Code Playgroud)
System.out.print(temp)在每次循环运行时,输出也没有帮助.
我的错误在哪里?
编辑:
public Polynomial clone() {
try {
return (Polynomial)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
打印hashCode(),temp并aPolynomial确实产生两个不同的值.
aPolynomialhashCode在每次for循环运行时都有相同的功能.
回答评论中的一些问题:
既然Polynomial不会从任何地方继承,据我所知,super.clone()将参考Object
我有自己的toString方法.
我相信您遇到的问题是:您验证temp了克隆aPolynomial,实际上是一个单独的对象.但是您从该对象使用的值在引用中temp.pol.在克隆方法期间,该引用被复制到新Polynomial实例,以便它们aPolynomial和temp它们的pol成员一起引用同一个对象.
最简单的解决方案是实现自定义clone()方法,您还可以克隆pol对新实例的引用Polynomial.
有点像:
public Polynomial clone() {
try {
Polynomial p = (Polynomial)super.clone();
p.pol = this.pol.clone();
return p;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |