5

I need to add objects to a list (with List semantics) while keeping all objects in the list unique. I figured LinkedHashSet would do, but the "re-insert" clause breaks this:

LinkedHashSet<String>list = new LinkedHashSet<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("a");
list.add("a");
System.out.println (list);

Output from the above is: [a, b, c], not [b, c, a] as I would like it.

Is there any such data-structure in Java which handles this case?

4

3 に答える 3

8

試す

    Set<String> set = Collections.newSetFromMap(new LinkedHashMap<String, Boolean>(16, 0.75f, true));
    set.add("a");
    set.add("b");
    set.add("c");
    set.add("a");
    set.add("a");
    System.out.println(set);

出力

[b, c, a]
于 2013-01-23T09:53:52.300 に答える
3

少し奇妙に思えるので、あなたが望むことをするすぐに使えるデータ構造はないと思います。LinkedHashSet の周りにラッパーを作成して、要素を再挿入しようとしたときに要素をポップし、再度挿入することをお勧めします。

于 2013-01-23T09:46:20.570 に答える
2

実際には、JDK ライブラリによって提供されるすぐに使えるデータ構造があります。このLinkedHashMapコンストラクターを見ると、次のようになります。

/**
 * Constructs an empty <tt>LinkedHashMap</tt> instance with the
 * specified initial capacity, load factor and ordering mode.
 *
 * @param  initialCapacity the initial capacity
 * @param  loadFactor      the load factor
 * @param  accessOrder     the ordering mode - <tt>true</tt> for
 *         access-order, <tt>false</tt> for insertion-order
 * @throws IllegalArgumentException if the initial capacity is negative
 *         or the load factor is nonpositive
 */
public LinkedHashMap(int initialCapacity,
                     float loadFactor,
                     boolean accessOrder) {
    super(initialCapacity, loadFactor);
    this.accessOrder = accessOrder;
}

余分なパラメータがありますaccessOrder。これに基づいて、新しく追加されたオブジェクトがリストの最後に移動されるaccessOrder - trueか ( )、元の場所に残ります ( accessOrder - false)。

これらの特性を持つを作成するにはSet、次のファクトリ メソッドを使用する必要がありますjava.util.CollectionsnewSetFromMap(LinkedHashMap(initialCapacity, loadFactor, accessOrder))

プロパティは、指定された要素とのすべてのaccessOrder相互作用を担当することに注意してください-それを呼び出すと、並べ替えも行われます(インターフェイスはラップされたメソッドを公開しないため、とにかく影響することはありません) .getHashMapSetgetHashMap

于 2013-01-23T10:14:51.027 に答える