我有一堂Odp。我想使用TreeSet保留Odp对象的排序集合。但是,我一直遇到问题。
public class OdpStorage {
private TreeSet<Odp> collection = new TreeSet<Odp>();
public addOdp(Odp o) {
return collection.add(o);
}
public int size() {
return collection.size();
}
}
如果collection.add(Odp o)已经在树中,它应该什么也不做,对吧?不知何故,此单元测试失败:
OdpStorage ts = new OdpStorage();
Odp ftw = new Odp("LOL");
Odp ktr = new Odp("OMG");
ts.addOdp(ftw);
ts.addOdp(ftw); //should do nothing
ts.addOdp(ftw); //should do nothing
ts.addOdp(ftw); //should do nothing
ts.addOdp(ktr);
assertEquals(2, ts.size());
断言失败。它期望为2,但返回值为5。为什么? odp.equals()函数可能会搞砸吗?
同样,调用
collection.contains(o)
也会失败,即使在X
集合中存在某个对象且o.equals(X)
返回true的情况下。Odp的.equals()函数:(由Eclipse生成)
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Odp))
return false;
Gene other = (Odp) obj;
if (sequence == null) {
if (other.sequence != null)
return false;
} else if (!sequence.equals(other.sequence))
return false;
return true;
}
相比于:
/**
* this = g0
* if they are equal, g1 is presumed to come first
*
* @return -1 if g0 comes before g1; 1 if g0 comes after g1
*/
@Override
public int compareTo(Odp g1) {
if (sequence.length() < g1.getSeq().length()) {
return -1;
}
else if (sequence.length() > g1.getSeq().length()) {
return 1;
}
if (sequence.compareTo(g1.getSeq()) < 0) {
return -1;
}
return 1;
}
hashCode()
不会被覆盖。问题?更新
hashCode()
如下:@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((sequence == null) ? 0 : sequence.hashCode());
return result;
}
但这仍然不能解决问题。
最佳答案
看来您的collection.add(o)
无法在支持TreeMap
中找到对象。您的Odp
是实现Comparable
还是在您已实现其Comparable
方法的TreeSet
上设置默认的compare
?如果是这样,则需要确保您的compareTo
(对于Comparable
),或者如果传入的对象是Comparator
,则compare
0
方法将返回equals
。
编辑(以回应您对原始帖子的评论):
It is recommended每当您覆盖HashCode()
时便覆盖equals()
EDIT2以响应您的compareTo
实现:
如果g0
和g1
相等,则应返回0。这是问题的根源。