我编写了一个在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)...这是唯一的方法
答案 0 :(得分:9)
几乎是唯一的方式。 HashSet
从未打算排序。它不会对您的商品进行任何排序,以换取contains
,add
和{{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重新插入到集合中。)