我需要关于如何使用上HashSet
可比类来获得一个升序排列的例子。比方说,我有这样一个HashSet
:
HashSet<String> hs = new HashSet<String>();
我怎样才能得到hs
是升序排列?
使用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
。例如。
Set<String> hashSet = getItSomehow();
Set<String> treeSet = new TreeSet<String>(hashSet);
// Now it's sorted based on the logic as implemented in String#compareTo().
HashSet
“不保证为向集合的迭代顺序。”使用LinkedHashSet
代替。
附录:“预知迭代顺序......不会产生与Comparable
相关的成本增加”我会第二@ BalusC的有关实现LinkedHashSet
和表达对TreeSet
轻微的偏好,提供点
附录:@Stephen提出了一个很重要的一点,这有利于@ TreeMap
的BalusC的建议。 LinkedHashSet
只有当数据是(几乎)静态和已经排序的更有效率的选择。
HashSets do not guarantee iteration order:
此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证为向集合的迭代顺序;特别是,它不保证该顺序恒久不变。此类允许null元素。
你可能需要选择a different datastructure如果你希望能够控制的迭代顺序(或实际上有一个在所有!)