【问题标题】:ordering a hashset example?订购哈希集示例?
【发布时间】:2010-08-01 00:39:17
【问题描述】:

我需要一个示例,说明如何在 HashSet 上使用可比较的类来获得升序。假设我有一个像这样的HashSet

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

如何让hs 升序排列?

【问题讨论】:

    标签: java data-structures hashset comparable sortedset


    【解决方案1】:

    请改用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().
    

    另见:

    【讨论】:

    • 你能举一个'youcomparator'的例子吗?谢谢
    • @AlbertoAcuña:不,LinkedHashSet 不对集合进行排序。它只是保留了插入顺序,这是一个非常不同的要求
    【解决方案2】:

    HashSet "不保证集合的迭代顺序。"请改用LinkedHashSet

    附录:我会支持@BalusC 关于实现Comparable 的观点并表达 略微偏爱LinkedHashSet,它提供“可预测的迭代顺序......而不会增加与TreeSet 相关的成本。”

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

    【讨论】:

    • AFAIK,链接哈希集保留(时间)插入顺序。面对随机插入,很难(即低效)使用链接哈希集来实现排序集。每次进行随机插入时,都需要重建整个 LinkedHashSet。
    • @Stephen C:我相信你是对的;我上面已经详细说明了。我欢迎任何澄清。
    【解决方案3】:

    哈希集do not guarantee iteration order:

    这个类实现了 Set 接口,由哈希表支持 (实际上是一个 HashMap 实例)。它 不保证 集合的迭代顺序;在 特别是,它不保证 订单将保持不变 时间。此类允许 null 元素。

    如果您希望能够控制迭代顺序(或者确实有一个!),您可能需要选择a different datastructure

    【讨论】:

    • 我可以把它作为一个集合集然后使用比较器吗? download.oracle.com/javase/6/docs/api/java/util/Comparator.html
    • AFAIK,链接哈希集保留(时间)插入顺序。面对随机插入,很难(即低效)使用链接哈希集来实现排序集。
    • @Stephen C:好点,我没有仔细看,这就是为什么我只是在“不同的数据结构”的建议下链接它,因为这个名字听起来大致正确。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多