-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

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 に答える
1

ハッシュセットの仕組みのため、それは不可能だと思います:

ハッシュ セットに何かを挿入すると、そのハッシュが計算され (いくつかの計算によって得られる特別な一意の値)、ハッシュから値へのマッピングとして格納されます。挿入の「履歴」は保持されません。

説明したことを実現したい場合は、リンクされたリストなどの別のデータ構造を選択することをお勧めします。

編集: llogiqSasikumar Murugesanによって提案されているように、ニーズに適合し、ソフトウェアの残りの部分をそのまま維持できる優れたデータ構造は、LinkedHashSet. これにより、ソフトウェアを他の場所で引き続き使用できますHashSet

于 2014-09-08T09:44:05.973 に答える