订购HashSet的例子吗?

问题描述 投票:20回答:3

我需要关于如何使用上HashSet可比类来获得一个升序排列的例子。比方说,我有这样一个HashSet

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

我怎样才能得到hs是升序排列?

java data-structures hashset comparable sortedset
3个回答
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。然后,您可以构建直接基于TreeSetHashSet。例如。

Set<String> hashSet = getItSomehow();
Set<String> treeSet = new TreeSet<String>(hashSet);
// Now it's sorted based on the logic as implemented in String#compareTo().

See also:


8
投票

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

附录:“预知迭代顺序......不会产生与Comparable相关的成本增加”我会第二@ BalusC的有关实现LinkedHashSet和表达对TreeSet轻微的偏好,提供点

附录:@Stephen提出了一个很重要的一点,这有利于@ TreeMap的BalusC的建议。 LinkedHashSet只有当数据是(几乎)静态和已经排序的更有效率的选择。


1
投票

HashSets do not guarantee iteration order

此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证为向集合的迭代顺序;特别是,它不保证该顺序恒久不变。此类允许null元素。

你可能需要选择a different datastructure如果你希望能够控制的迭代顺序(或实际上有一个在所有!)

© www.soinside.com 2019 - 2024. All rights reserved.