2013-02-23 52 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被调用。)