我正在研究多项式计算器。我的问题是使用equals方法。以下是相关代码:
public class Poly{
Term[] terms;
//Constructors-------------------------------------------
public Poly() {}
public Poly(ArrayList<Term> Terms) {
terms = Terms.toArray(new Term[Terms.size()]);
Arrays.sort(terms, new TermComparator());
}
//Methods-------------------------------------------------
public boolean equals(Poly x) {
boolean q=false;
if(this == x){
q=true;
}
return q;
}
//used in constructor to order terms
class TermComparator implements Comparator<Term> {
@Override
public int compare(Term t1, Term t2) {
return t2.getExp() - t1.getExp();
}
}
}
即使两个Poly对象具有相同的值,equals方法也始终返回false。有人可以帮忙吗?
答案 0 :(得分:5)
您的Poly class equals方法应如下所示
@Override
public boolean equals(Object obj) {
if (this == obj) //checking both are same instance
return true;
if (obj == null) // checking obj should not be null
return false;
if (getClass() != obj.getClass()) //checking both objects from same class
return false;
Poly other = (Poly) obj;
return Arrays.equals(terms, other.terms); //checking all the array values
}
如果要将Poly对象添加到集合中,则还需要实现哈希代码方法。
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(terms);
return result;
}
请参阅
Why do I need to override the equals and hashCode methods in Java?
How should equals and hashcode be implemented when using JPA and Hibernate
答案 1 :(得分:1)
您似乎需要进行以下2项更改:
不要使用代码比较引用,如下所示:
if(this == x){
q=true;
}
您需要比较对象的内容 - 您案例中terms
的内容。
覆盖equals
方法时,您也可以更好地覆盖hashcode
方法。
答案 2 :(得分:0)
我的解决方案涉及首先在术语类中创建一个equals方法。然后,您将使用该equals方法在多项式类中编写equals方法。所以这里是术语的equals方法的代码:
public boolean equals(Term x){
boolean a= false;
int expThis = this.getExp();
int coefThis = this.getCoeff();
int expX = x.getExp();
int coefX = x.getCoeff();
if(expThis==expX && coefThis==coefX){
a=true;
}
return a;
}
我的多项式构造函数已按递减顺序组织所有项。如果你按顺序有多项式,那么你要做的就是先检查两个多项式是否大小相同,然后循环遍历两个多项式的所有项,使用术语类中的equals方法来比较项。所以这是多项式的equals方法的代码:
public boolean equals(Object obj) {
boolean w=false;
Poly other = (Poly) obj;
int L1 = other.terms.length;
int L2 = this.terms.length;
if(L1==L2){
for(int q=0; q<L1; q++){
Term a=other.terms[q];
Term b=this.terms[q];
if(a.equals(b)==true){
w=true;
}
else{
w=false;
break;
}
}
}
return w;
}