告诉HashSet如何对数据进行排序

时间:2012-10-29 20:47:42

标签: java hashset

我正在尝试创建一个HashSet(或任何集合类型 - 但我认为HashSet最适合我),无论插入什么内容都会保持顺序。这是我正在进行的联系经理项目。 我一直在试验,下面的例子。

import java.util.*;

public class TestDriver{

    public static void main(String[] args)
    {
        FullName person1 = new FullName("Stephen", "Harper");
        FullName person2 = new FullName("Jason", "Kenney");
        FullName person3 = new FullName("Peter", "MacKay");
        FullName person4 = new FullName("Rona", "Ambrose");
        FullName person5 = new FullName("Rona", "Aabrose");


        HashSet<FullName> names = new HashSet<FullName>();

        names.add(person3);
        names.add(person1);
        names.add(person4);
        names.add(person2);

        System.out.println(names);      
   } 
}

我希望输出按字母顺序排列名称 - 至少根据它们的名字或姓氏。但是,我甚至无法辨别HashSet用于提出此排序的方法;

[Jason Kenney, Rona Ambrose, Stephen Harper, Peter MacKay]

我的问题是,如何告诉我的程序如何根据我的规格对名称进行排序?

5 个答案:

答案 0 :(得分:18)

HashSet不会为条目提供任何有意义的顺序。 documentation说:

  

它不保证集合的迭代顺序;在   特别是,它不保证订单将保持不变   随着时间的推移。

要获得合理的排序,您需要使用其他Set实现,例如TreeSetConcurrentSkipListSetSortedSet接口的这些实现允许您提供指定如何对条目进行排序的Comparator;类似的东西:

public class SortByLastName implements Comparator<FullName>{
    public int compare(FullName n1, FullName n2) {
        return n1.getLastName().compareTo(n2.getLastName());
    }
}

TreeSet<FullName> names = new TreeSet<FullName>(new SortByLastName());

您可以改为使FullName类实现Comparable接口,但如果您希望有时按姓氏排序,有时按名字或其他标准排序,则可能无效。

答案 1 :(得分:10)

使用Treeset进行自然排序。

HashSet--- not ordered/sorted
LinkedhashSet--- maintains insertion order
TreeSet--- sorts in natural order

为您的案例使用TreeSet。

答案 2 :(得分:9)

HashSet不保留订单,转到TreeSet并实施您自己的Comparator以指示TreeSet如何比较

new TreeSet<FullName>(new Comparator<FullName>(){
        public int compare(Fullname one, FullName two{/*logic*/}
});

查看

答案 3 :(得分:4)

好像您需要TreeSet才能按字母顺序排列,或LinkedHashSet需要保留广告订单。

请注意,FullName必须实施Comparable<FullName>才能在TreeSet中使用(或者您必须提供外部比较器)。

答案 4 :(得分:0)

试试这个:

 System.out.println(names.toList.sorted)