对HashSet进行排序

时间:2013-02-23 15:48:59

标签: java sorting

我编写了一个在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;
    }
}

我还没有粘贴其他两个类。我在这些类中所做的就是填充数据而其他类是主类。

现在我明白通过Java Doc Api我知道在Collections类中有一个名为sort()的方法。现在我的问题是那个排序mathod的列表。

这里是来自doc sort(列表列表)的签名。我正面临着排序我的hashset的问题。有人告诉我将HashSet转换为TreeSet(其中一个线程中也提到了stackoverflow)...这是唯一的方法

2 个答案:

答案 0 :(得分:9)

几乎是唯一的方式。 HashSet从未打算排序。它不会对您的商品进行任何排序,以换取containsadd和{{1}的效果操作。

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

  

此类实现Set接口,由哈希表(实际上是HashMap实例)支持。 不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。该类允许null元素。

因此,只需使用remove即可根据您班级的自然顺序进行排序。我看到你的类实现了TreeSet,这使得它可以在Comparable

中使用

答案 1 :(得分:0)

使用 LinkedHashSet ,因为它以排序的方式插入元素,因此该集合始终排序。

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

  

Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序。请注意,如果将元素重新插入到集合中,则不会影响插入顺序。 (如果s.contains(e)在调用之前立即返回true,则调用s.add(e)时,将元素e重新插入到集合中。)