-4

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

3 回答 3

1

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

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

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

编辑:正如lllogiqSasikumar Murugesan所建议的那样,一个很好的数据结构可以满足您的需求并保持您软件的其余部分不变,以使用LinkedHashSet. 这使您的软件仍然可以HashSet在其他地方使用。

于 2014-09-08T09:44:05.973 回答
1

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

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

于 2014-09-08T09:44:41.503 回答
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);
    }

输出: a b c d e

于 2014-09-08T09:47:46.400 回答