简短说明:我想对Java中的多项式进行运算。多项式具有整数系数。如果我将两个多项式相加,则我希望结果也具有Integer系数。如果我集成一个多项式,我希望结果具有双系数。
一个polynome是从一个单体列表中构建的。一个monome有一个系数(一个数字)和一个等级。为了实现Integer-Double转换,我创建了两个子类:一个名为MonomInt的子类,具有一个Integer系数,另一个名为MonomDouble的子类具有Double系数。
这是monome类的一部分:
public class Monom implements Comparable<Monom>{
protected Integer grad;
protected Number coeficient;
public Monom(Number coeficient, Integer grad){
if(grad < 0){
this.grad = 0;
this.coeficient = 0;
} else {
this.grad = grad;
this.coeficient = coeficient;
}
} ...
MonomInt和MonomDouble具有相同的构造函数,唯一的区别是系数是Integer或Double。
这是polynome类的一部分:
public class Polinom {
private List<Monom> monoame = new ArrayList<Monom>();
private Integer grad = 0;
public Polinom(List<Monom> mon) {
for(Monom m : mon) {
Integer gradNou = m.getGrad();
if(this.grad < gradNou) {
this.grad = gradNou;
}
monoame.add(m);
}
simplify();
}
Simplify()是一个执行以下功能的函数:每当我调用它时,如果有具有相同rank(grad)的单体,它们将被添加到第一个单体中,而另一个将从列表中删除。 / p>
public void simplify() {
Collections.sort(monoame);
for(int i = 0; i < monoame.size() - 1; i++) {
while(monoame.get(i).getGrad().equals(monoame.get(i + 1).getGrad())){
Number oldCoef = monoame.get(i).getCoeficient();
Number newCoef = monoame.get(i + 1).getCoeficient();
monoame.get(i).setCoeficient((Number)(oldCoef.doubleValue() + newCoef.doubleValue()));
monoame.remove(i + 1);
if(i + 1 == monoame.size()) {
break;
}
}
}
resetGrad();
}
对于添加,我进行了以下废除:从第二个多义词中取出列表,并将其元素逐个添加到第一个多义词中。最后,简化。
public Polinom suma(Polinom p, Polinom q) {
Polinom suma = new Polinom(p.getMonList());
for(Monom qM : q.getMonList()) {
Monom aux = new MonomInt(qM.getCoeficient().intValue(), qM.getGrad());
suma.addMonom(aux);
}
return suma;
}
例如,通过将“ 3x ^ 3 + x ^ 2 + 3x + 2”与“ 2x”相加,我得到3x ^ 3 + 1x ^ 2 + 5.0x + 2(添加的那个被修改为Double) 。通过集成,一切都可以正常工作,因为就像前面的示例一样,它可以自动转换为Double。我该如何解决?
编辑:另外,我忘了提到列表中的单体位是按rank(grad)排序的。
答案 0 :(得分:0)
我认为您最好的选择是摆脱MonomInt
和MonomDouble
类,并让您的Monom
类将其系数列为Double
而不是{ {1}}。然后,您可以有一个使用Number
作为参数(不进行转换)的构造函数,以及另一个使用Double
并将其强制转换(显式或隐式)的构造函数。
然后输出,如果Integer
的“。0” 尾随
是一个问题,您可以重载toString()并对此进行一些明确的格式选择。