【问题标题】:Is there any way to get the items from HashSet in insertion order in java?有没有办法在java中按插入顺序从HashSet中获取项目?
【发布时间】:2014-09-08 09:35:17
【问题描述】:

我们现有的代码使用 HashSet 来存储数据。我知道 Set 接口的性质是给出随机顺序。但我需要相同的插入顺序。有没有办法从集合中获取插入顺序???

请指导我摆脱这个问题?

我还使用了 LinkedHashSet,它还以其他顺序而不是我想要的插入顺序给出元素...

Set attachmentSet=new HashSet();
        attachmentSet.add("dfsdfsd");
        attachmentSet.add("erwerwer");
        attachmentSet.add("vcvcvcv");
        attachmentSet.add("ytytyt");

        Iterator attachItr=attachmentSet.iterator();
        while(attachItr.hasNext())
        {
            System.out.println("SET Item::"+attachItr.next());
        }

LinkedHashSet newCopy = new LinkedHashSet();
        newCopy.add("dfsdfsd");
        newCopy.add("erwerwer");
        newCopy.add("vcvcvcv");
        newCopy.add("ytytyt");
        Iterator attachItr2=copy.iterator();
        while(attachItr2.hasNext())
        {
            System.out.println("NEW LinkedHashSet Item::"+attachItr2.next());
        }

【问题讨论】:

  • 通过小错误修复 - Iterator attachItr2 = newCopy.iterator() - 我得到了请求的输出。 LinkedHashSet 专门维护插入顺序。您遇到了什么问题?
  • 您希望项目在集合中排序(基于哈希码),或者您希望项目按照您插入它们的顺序? LinkedHashSet 应该适用于后一种情况。
  • @TheLostMind: 我想要 HashSet 中的插入顺序。我怎样才能得到它?
  • @Thanks Seelenvirtuose:我没看到。你能帮我从插入顺序中的 HashSet 中获取元素吗?

标签: java collections hashset linkedhashset


【解决方案1】:

我会说这是不可能的,因为哈希集的工作方式:

当您将某些内容插入散列集时,会计算其散列(通过某些数学获得的特殊唯一值),然后将其存储为从散列到其值的映射。不保留任何插入“历史记录”。

如果你确实想实现你所描述的,你最好选择另一种数据结构,比如链表。

编辑:llogiqSasikumar Murugesan 建议,这是一个很好的数据结构,可以满足您的需求并保留您的软件的其余部分就像使用LinkedHashSet一样。这使您的软件仍然可以在其他地方使用HashSet

【讨论】:

  • 非常感谢...我明白了
  • 请注意,LinkedHashSet 在内部将 HashSet 与 LinkedList 结合在一起。
【解决方案2】:

Seelenvirtuose 说得对:LinkedHashSet 维护插入顺序。您的代码也有一个错误,因为您迭代了copy 而不是newCopy。也许这就是您没有看到正确排序的原因?

另外,如果您想测试它是否不按自然顺序排序,最好添加元素以使自然顺序与插入顺序不同。

【讨论】:

    【解决方案3】:

    您必须使用 LinkedHashSet 来保留插入顺序,请参阅下面的示例代码

    LinkedHashSet lhs = new LinkedHashSet();
    
        lhs.add("a");
        lhs.add("b");
        lhs.add("c");
        lhs.add("d");
        lhs.add("e");
    
        Iterator iterator=lhs.iterator();
    
        while(iterator.hasNext())
        {
          String value=(String)iterator.next();
    
          System.out.println("Value :"+value);
        }
    

    输出: 一个 b C d e

    【讨论】:

    • 如果您需要将lhs 用于另一个接口(例如HashSet lhs = new LinkedHashSet();),您仍然可以将lhs 声明和使用为HashSet
    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2020-06-20
    • 2020-11-18
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多