У меня есть класс 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.
Функция .equals () Odp: (генерируется 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;
}
CompareTo:
/**
* 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()
не отменяется. Проблема
UPDATE
hashCode()
выглядит следующим образом:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((sequence == null) ? 0 : sequence.hashCode());
return result;
}
Но это все еще не решает проблему.