HashSet与TreeSet不同的size()

问题描述 投票:0回答:1

我正在读取文件,并将单词添加到HashSetTreeSetHashSet.size()给我350个项目,但TreeSet.size() 349个项目。有人对此差异有解释吗?

public static void main(String[] args) throws FileNotFoundException {
    File file = new File("src/words.txt");
    Scanner read = new Scanner(file);
    Set<Word> hashSet = new HashSet<Word>();
    Set<Word> treeSet = new TreeSet<Word>();
    while(read.hasNext()) {
        Word word = new Word(read.next());
        hashSet.add(word);
        treeSet.add(word);
    }

    System.out.println(hashSet.size());
    System.out.println(treeSet.size());

    Iterator<Word> itr = treeSet.iterator();
    while (itr.hasNext()) {
        System.out.println(itr.next().toString());
    }
}

public class Word implements Comparable<Word> {

        private String word;

        public Word(String str) {
            this.word = str; }

        public String toString() {
            return word.toLowerCase(); }

        /* Override Object methods */
        public int hashCode() {
            int hashCode = 0;
            int temp;
            for(int i = 0; i<word.length();i++){
                temp = (int) word.charAt(i);
                hashCode += temp^hashCode;
            }
            return hashCode;
        }

        public boolean equals(Word other) {
            if(other instanceof Word){
            if(compareTo(((Word) other))==0)
                return true;
            else
                return false;}
            else
                return false;
        }


        public int compareTo(Word w) {
            if(this.word.compareToIgnoreCase(w.toString())>0)
                return 1;
            if(this.word.compareToIgnoreCase(w.toString())<0)
                return -1;
            else
                return 0;
        }


}
java hashset treeset
1个回答
1
投票

将您的等值从equals(Word)更改为equals(Object)。还请添加@Override属性。

此外,您的hashCode方法不能保证对于相等的两个单词(忽略大小写),它们将具有相同的哈希码。您可以在计算哈希码之前在toUpperCase()上使用word

© www.soinside.com 2019 - 2024. All rights reserved.