有没有办法在java中以插入顺序从HashSet中获取项目?

时间:2014-09-08 09:35:17

标签: java collections hashset linkedhashset

我们现有的代码使用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());
        }

3 个答案:

答案 0 :(得分:1)

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

当您将某些内容插入哈希集时,会计算其哈希值(通过某些数学获得的特殊唯一值),然后将其存储为从哈希值到其值的映射。没有'历史'插入是保持。

如果您希望实现所描述的内容,最好选择其他数据结构,例如链接列表。

按照 llogiq Sasikumar Murugesan 的建议

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

答案 1 :(得分:1)

Seelenvirtuose没错:LinkedHashSet维护广告订单。此外,您的代码有错误,因为您迭代copy而不是newCopy。也许这就是你没有看到正确排序的原因?

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

答案 2 :(得分:1)

您必须使用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 ë