订购一个hashset示例?

时间:2010-08-01 00:39:18

标签: java data-structures hashset comparable sortedset

我需要一个示例,说明如何在HashSet上使用类似的类来获得升序。假设我有HashSet喜欢这个:

HashSet<String> hs = new HashSet<String>();

如何让hs按升序排列?

3 个答案:

答案 0 :(得分:45)

请改用TreeSet。它有一个constructor taking a Comparator。它会自动对Set进行排序。

如果您想将HashSet转换为TreeSet,请执行以下操作:

Set<YourObject> hashSet = getItSomehow();
Set<YourObject> treeSet = new TreeSet<YourObject>(new YourComparator());
treeSet.addAll(hashSet);
// Now it's sorted based on the logic as implemented in YourComparator.

如果您拥有的项目已经实施Comparable且其默认订购顺序已经是您想要的,那么您基本上不需要提供Comparator。然后,您可以根据TreeSet直接构建HashSet。 E.g。

Set<String> hashSet = getItSomehow();
Set<String> treeSet = new TreeSet<String>(hashSet);
// Now it's sorted based on the logic as implemented in String#compareTo().

另见:

答案 1 :(得分:8)

HashSet“不保证集合的迭代顺序。”请改用LinkedHashSet

补遗:我会对@ BalusC提出实施Comparable和表达的观点 略微偏好LinkedHashSet,它提供“可预测的迭代顺序......而不会导致与TreeSet相关的成本增加。”

附录:@Stephen提出了一个重要的观点,这有利于@BalusC提出TreeMap的建议。只有当数据(几乎)是静态的且已经排序时,LinkedHashSet才是更有效的替代方案。

答案 2 :(得分:1)

HashSets do not guarantee iteration order

  

此类实现Set   接口,由哈希表支持   (实际上是一个HashMap实例)。它   不保证   集合的迭代顺序;在   特别是,它并不保证   订单将保持不变   时间。该类允许null   元件。

如果您希望能够控制迭代顺序(或者确实有一个迭代顺序,您可能需要选择a different datastructure。)