2013-02-23 54 views
2

我寫了一個程序在一個HashSet插入數據...這裏是排序的HashSet

public class Person implements Comparable<Person> 
{ 
    private int person_id; 
    private String person_name; 
    public Person(int person_id,String person_name) 
    { 
     this.person_id=person_id; 
     this.person_name=person_name; 
    } 
    /* getter and setter method */ 
    public boolean equals(Object obj) 
    { 
     Person p=(Person)obj; 
     if(!(p instanceof Person)) 
     { 
      return false; 
     } 
     else if(this.person_id==p.person_id) 
      return true; 
     else 
      return false; 
    } 
    @Override 
    public int hashCode() 
    { 
     return person_id*6; 
    } 
    @Override 
    public int compareTo(Person o) 
    { 
     if(this.person_id>o.person_id) 
      return 1 ; 
     else if(this.person_id<o.person_id) 
      return -1; 
     else return 0; 
    } 
} 

我還沒有貼上另外兩個classes.All我所做的這些類中的填充數據等的代碼是主類。

現在我明白了,通過Java文檔阿比我才知道,有)於類別排序調用的方法(class.Now對此我的問題是,那種馬託花費清單。

這裏是從文檔排序(名單列表)的簽名。有人告訴我將HashSet轉換爲TreeSet(這也是在其中一個線程中提到的是stackoverflow)...這是唯一的方法

+3

爲什麼不能擺脫HashSet'的'和從一開始就使用'TreeSet'? – Dukeling 2013-02-23 15:50:00

回答

9

幾乎是唯一的方法。 HashSet從來就不是進行排序。它不會保留您的物品的任何訂單,以換取性能containsaddremove操作。

http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html

此類實現Set接口,由哈希表(實際上是一個HashMap實例)支持。 對集合的迭代次序不作任何保證;特別是,它不保證該順序將隨着時間保持不變。這個類允許null元素。

所以,只需使用TreeSet,它可以根據您的班級的自然順序進行排序。我看到你的類實現Comparable這使得它容易在TreeSet

+0

我更多的問題,我想它的關於地圖...我可以把在同一個線程? – 2013-02-23 19:43:07

+8

號問一個新問題。 – luiges90 2013-02-24 04:21:06

0

使用LinkedHashSet來代替,因爲它插入排序的方式的元素,所以集始終排序。

http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html更多信息:

哈希表和Set接口的鏈接列表實現,具有可預知的迭代順序。這個實現與HashSet的不同之處在於它保持了一個雙向鏈表,它貫穿其所有條目。此鏈接列表定義迭代排序,即元素插入到集合中的順序(插入順序)。請注意,如果元素重新插入到集合中,則插入順序不受影響。 (元素e是重新插入到集合S如果s.add(e)在s.contains(E)將調用之前立即返回true被調用。)