2

我已经编写了一个程序来在 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() 的方法。现在我的问题是排序方法需要列表。

这是来自文档排序(列表列表)的签名。我在对我的哈希集进行排序时遇到问题。有人告诉我将 HashSet 转换为 TreeSet(其中一个线程中还提到了 stackoverflow)...这是唯一的方法

4

2 回答 2

9

几乎是唯一的方法。HashSet从来都不是为了排序。它不保留您的项目的任何顺序,以换取性能contains和操作。addremove

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

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

因此,只需使用TreeSetwhich 根据您的班级的自然顺序进行排序。我看到你的类实现Comparable了它很容易在TreeSet

于 2013-02-23T15:50:49.437 回答
0

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

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

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

于 2015-02-16T10:36:40.883 回答