我有以下代码:
public class EnglishWord implements Comparable<EnglishWord> {
private String word;// unique
private int occurenceNumber; //not unique
public EnglishWord(String word, int occurenceNumber) {
this.word = word;
this.occurenceNumber= occurenceNumber;
}
public boolean equals(EnglishWord anotherWord) {
return word.equals(anotherWord.getWord());
}
public int compareTo(EnglishWord anotherWord) {
return occurenceNumber - anotherWord.getOccurenceNumber;
}
我想将所有
EnglishWord
s 添加到 Set
中,其中每个唯一的 EnglishWord
都有一个 word
对象。我希望 Set
按 occurrenceNumber
排序。我已经通过 occurrenceNumber
对单词进行了排序,但没有将具有唯一 EnglishWord
的 occurrenceNumber
添加到 Set
。作为代码,这就是我的意思:Set<EnglishWord> mySet= new TreeSet<EnglishWord>();
mySet.add(new EnglishWord("hello",8));
mySet.add(new EnglishWord("hi",8));
在此之后,
mySet
的大小为 1。 最佳答案
您应该同时定义 equals 和 hashCode 或不定义它们。在您的代码中,对于 EnglishWord 的两个实例 x 和 y,会发生 x.equals(y) == true
而 x.hashCode() != y.hashCode()
。如果您希望您的类使用 java.util 中的集合类,则这是不合法的。见 the Object JavaDoc 。要解决此问题,请添加如下内容:
@Override
public int hashCode() {
return this.word.hashCode();
}
equals 方法必须具有签名“public boolean equals(Object other)”——您的 equals 接受一个 EnglishWord 参数,这导致您的方法基本上被忽略。使固定:
@Override
public boolean equals(Object other) {
if (other == null) return false;
if (other.getClass() != this.getClass()) return false;
final EnglishWord ow = (EnglishWord) other;
return ow.word.equals(this.word);
}
通常,使用
@Override
注释可以帮助您提高编码对此类错误的鲁棒性,因为通过这种方式将运行时错误转化为编译时错误。此外,您对
Comparable
接口(interface)的实现可能应该使用泛型。