订购一个hashset示例?

我需要一个关于如何在HashSet上使用类似的类来获得升序的示例。 假设我有一个像这样的HashSet

 HashSet hs = new HashSet(); 

我怎样才能让hs按升序排列?

请改用TreeSet 。 它有一个带Comparator的构造函数 。 它会自动对Set排序。

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

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

如果您拥有的项目已经实现了Comparable并且其默认订购顺序已经是您想要的,那么您基本上不需要提供Comparator 。 然后,您可以直接基于HashSet构造TreeSet 。 例如

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

也可以看看:

  • 对象排序教程
  • 集合教程 – 设置实现

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

附录:我将第二个@BalusC关于实现Comparable的观点,并表达对LinkedHashSet的轻微偏好,它提供了“可预测的迭代顺序……而不会产生与TreeSet相关的增加的成本。”

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

HashSet 不保证迭代顺序 :

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

如果您希望能够控制迭代顺序(或者实际上只有一个!),您可能需要选择不同的数据结构 。