我有以下代码:

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 对象。我希望 SetoccurrenceNumber 排序。我已经通过 occurrenceNumber 对单词进行了排序,但没有将具有唯一 EnglishWordoccurrenceNumber 添加到 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) == truex.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)的实现可能应该使用泛型。

10-08 20:17