2012-04-12 25 views
0

我正在實現一個TreeSet,它將根據人的年齡進行排序,但如果人的名字是平等的,那麼一個人不會被保存在集合中。我實現了equals和hashcode,但是這個集合將保存所有人,即使他們有相同的名字。我不知道爲什麼。如何在Java中實現TreeSet?

public class Person implements Comparable<Person>{ 
    private String name; 
    private int age; 

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

    @Override 
    public int compareTo(Person o) { 
     if(this.getAge()<o.getAge()){ 
      return -1; 
     } 
     return this.getAge() == o.getAge()?0:1; 
    } 

    @Override 
    public boolean equals(Object object){ 
     return name.equals(((Person)object).getName()); 
    } 

    @Override 
    public int hashCode(){ 
     return name.hashCode(); 
    } 

    public String getName() { 
     return name; 
    } 

    public int getAge() { 
     return age; 
    } 

    @Override 
    public String toString() { 
     return "Person [name=" + name + ", age=" + age + "]"; 
    } 

    public static void main(String[] args){ 
     Set<Person> set = new TreeSet<Person>(); 
     set.add(new Person("Jack",30)); 
     set.add(new Person("Jack",20)); 
     System.out.println(set); 
    } 
} 

回答

3

您可以在compareTo()函數的開頭添加

if(name.equals(o.getName())) { 
    return 0; 
} 

。這樣TreeSet可以假設a.equals(b)相當於a.compareTo(b) == 0並且您仍然可以按年齡排序,因爲集合中的所有名稱都是不同的。

+0

非常感謝你,我知道該怎麼做。 – NOrder 2012-04-12 06:39:40

+0

+1爲務實的回答:) – powerMicha 2012-04-12 06:45:48

2

你不能那樣做。 equals和compareTo必須做「同樣的事情」。也就是說,如果equals返回true,那麼compareTo應該返回0,反之亦然。

+0

有沒有什麼辦法按年齡使用集合排序元素,但按名稱比較相同的元素? – NOrder 2012-04-12 06:28:18

+0

爲TreeSet使用自定義比較器? – 2012-04-12 06:31:00

+0

比較器應按年齡先比較,然後按名稱 - 就是這樣! – powerMicha 2012-04-12 06:37:07

0

據我所知,從執行TreeSet,它只能包含獨特的元素。爲了將這些元素存儲在TreeSet中,實現將比較新元素與現有的一次使用compareTo()方法。

你的代碼目前說 - 人是由名稱相同,但只按年齡可比

我建議你要麼改變equals()´,的compareTo()and的hashCode()`方法取的名字和年齡成帳戶。

按年齡您Person對象進行排序,我會建議ArrayList和排序它通過定製Comparator

+1

你的意思是不能按年齡分類並按名稱比較? – NOrder 2012-04-12 06:29:23

+0

按自定義比較排序 – 2012-04-12 06:31:28

+0

謝謝,我會試試看。 – NOrder 2012-04-12 06:33:20

0

Set(其TreeSet繼承的)的定義: http://docs.oracle.com/javase/6/docs/api/java/util/Set.html

集包含沒有對E1元件和e2使得e1.equals(E2)

TreeSet也必須(來自:http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html):

排序ma由一組intained(無論是否提供了明確的比較器)必須與equals一致,如果要正確實現Set接口

所以,你compareTo()方法應該檢查兩個Personequals()通過name第一,如果他們不是,請檢查他們的age