订购一个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元素。
如果您希望能够控制迭代顺序(或者实际上只有一个!),您可能需要选择不同的数据结构 。