簡體   English   中英

在java中使用自然順序和treeset

[英]using Natural order with treeset in java

我得到了一個意想不到的輸出。 請看一看。 我無法找到問題所在。 我的計划有什么問題? 誰能解釋一下? 我得到了輸出

    Joe     Sue     Mike      Clare   Juliet       
    Joe         Mike        Clare        Juliet

TreeSetsTreeMaps對象以及使用Comparable Interface的Collections.sort() Lists

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

class Person implements Comparable<Person> {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final Person other = (Person) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public int compareTo(Person person) {
        int len1 = name.length();
        int len2 = person.name.length();

        if(len1 > len2) {
            return 1;
        }
        else if(len1 < len2) {
            return -1;
        }
        else {
            return 0;
        }
    }
}

public class App {

    public static void main(String[] args) { 

        List<Person> list = new ArrayList<Person>();
        SortedSet<Person> set = new TreeSet<Person>();


//adding  Element
        addElements(list);
        addElements(set);


//sorting element 
        Collections.sort(list);

//displaying result 
        showElements(list);
        System.out.println();
        showElements(set);
    }


//adding element methods

    private static void addElements(Collection<Person> col) {
        col.add(new Person("Joe"));
        col.add(new Person("Sue"));
        col.add(new Person("Juliet"));
        col.add(new Person("Clare"));
        col.add(new Person("Mike"));
    }

    private static void showElements(Collection<Person> col) {
        for(Person element: col) {
            System.out.println(element);
        }
    }

}

您是按照姓名的長度來比較這些人。 名稱“Joe”和“Sue”具有相同的長度。 因此,TreeSet中只能出現其中一個。 但是,這個比較標准 equals 的實現不一致

您應該將Person對象放入列表中,並使用Collections#sort對此列表進行Collections#sort - 最好使用自己的Comparator 另請參閱https://stackoverflow.com/a/21659849

編輯:進一步解釋:

Set只能包含每個元素一次 通過指定compareTo方法的方式,您實現了“Sue”和“Joe”相等(因為它們的名稱長度相等)。 所以它們不能同時出現在Set

注意:基於equals方法,它們並不equals 但是TreeSet使用了compareTo方法,而這個compareTo方法目前與equals不一致。 因此,由於您的compareTo方法錯誤, Set顯示錯誤的行為。

編輯:一個可能的解決方案:

如果名稱長度相等,則可以按字母順序進行比較。 這樣, compareTo方法與equals一致 :當且僅當名稱相等時,它將返回0。

@Override
public int compareTo(Person person) {
    int len1 = name.length();
    int len2 = person.name.length();

    if(len1 > len2) {
        return 1;
    }
    else if(len1 < len2) {
        return -1;
    }
    else {
        return name.compareTo(person.name);
    }
}

如果可以將元素添加到Set,則SortedSet使用compareTo進行評估。 您的輸入包含兩個具有相同長度的名稱(您的比較標准),因此必須過濾掉Joe或Sue中的一個(在您的情況下為Sue)。

TreeSet文檔討論了(非強制)compareTo實現與equals一致的實現。 在你的情況下,'Joe'和'Sue'的長度相等,根據你的compareTo實現,它們是相同的。 一種解決方法是比較compareTo方法中的哈希碼值,如果它們的長度相等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM