我需要一个示例,说明如何在HashSet
上使用类似的类来获得升序。假设我有HashSet
喜欢这个:
HashSet<String> hs = new HashSet<String>();
如何让hs
按升序排列?
答案 0 :(得分:45)
请改用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
。 E.g。
Set<String> hashSet = getItSomehow();
Set<String> treeSet = new TreeSet<String>(hashSet);
// Now it's sorted based on the logic as implemented in String#compareTo().
答案 1 :(得分:8)
HashSet
“不保证集合的迭代顺序。”请改用LinkedHashSet
。
补遗:我会对@ BalusC提出实施Comparable
和表达的观点
略微偏好LinkedHashSet
,它提供“可预测的迭代顺序......而不会导致与TreeSet
相关的成本增加。”
附录:@Stephen提出了一个重要的观点,这有利于@BalusC提出TreeMap
的建议。只有当数据(几乎)是静态的且已经排序时,LinkedHashSet
才是更有效的替代方案。
答案 2 :(得分:1)
HashSets do not guarantee iteration order:
此类实现Set 接口,由哈希表支持 (实际上是一个HashMap实例)。它 不保证 集合的迭代顺序;在 特别是,它并不保证 订单将保持不变 时间。该类允许null 元件。
如果您希望能够控制迭代顺序(或者确实有一个迭代顺序,您可能需要选择a different datastructure。)