【发布时间】:2010-08-01 00:39:17
【问题描述】:
我需要一个示例,说明如何在 HashSet 上使用可比较的类来获得升序。假设我有一个像这样的HashSet:
HashSet<String> hs = new HashSet<String>();
如何让hs 升序排列?
【问题讨论】:
标签: java data-structures hashset comparable sortedset
我需要一个示例,说明如何在 HashSet 上使用可比较的类来获得升序。假设我有一个像这样的HashSet:
HashSet<String> hs = new HashSet<String>();
如何让hs 升序排列?
【问题讨论】:
标签: java data-structures hashset comparable sortedset
请改用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。然后,您可以直接基于HashSet 构造TreeSet。例如
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。
附录:我会支持@BalusC 关于实现Comparable 的观点并表达
略微偏爱LinkedHashSet,它提供“可预测的迭代顺序......而不会增加与TreeSet 相关的成本。”
附录:@Stephen 提出了一个重要观点,支持@BalusC 对TreeMap 的建议。 LinkedHashSet 只有当数据(几乎)是静态的并且已经排序时才是更有效的选择。
【讨论】:
哈希集do not guarantee iteration order:
这个类实现了 Set 接口,由哈希表支持 (实际上是一个 HashMap 实例)。它 不保证 集合的迭代顺序;在 特别是,它不保证 订单将保持不变 时间。此类允许 null 元素。
如果您希望能够控制迭代顺序(或者确实有一个!),您可能需要选择a different datastructure
【讨论】: