20

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

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

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

4

3 回答 3

46

改用 a TreeSet。它有一个构造函数采用Comparator. 它会自动排序Set

如果要将 a 转换HashSet为 a 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().

也可以看看:

于 2010-08-01T00:49:13.973 回答
8

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

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

附录:@Stephen 提出了一个重要的观点,支持@BalusC 的TreeMap. LinkedHashSet只有当数据(几乎)是静态的并且已经排序时,它才是更有效的选择。

于 2010-08-01T00:41:48.440 回答
1

HashSet不保证迭代顺序

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

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

于 2010-08-01T00:42:53.243 回答