2013-01-23 20 views
4

我需要將對象添加到列表(使用List語義),同時保持列表中的所有對象都是唯一的。我想通LinkedHashSet會做,但「重新插入」條款打破這樣的:從上面的哪個數據結構用於保持唯一的插入順序的列表

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); 

輸出是:[a, b, c],而不是作爲[b, c, a]我想它。

Java中有這樣的數據結構來處理這種情況嗎?

+3

什麼是預期的行爲?這不允許重複。 – m0skit0

+1

你爲什麼期望輸出是'[b,c,a]'? LinkedHashSet維護插入順序,從而維護輸出。 –

+0

我想操作者想要最後的插入順序(如果一個鍵被重新插入,它的位置應該改變到一個新的位置)。 – assylias

回答

7

嘗試

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] 
+0

這是一個好主意,但值得一提的是get也會改變順序。 – assylias

+0

@assylias是的,但'Set'沒有get(),所以它的工作原理。這是一個非常聰明的想法。 –

+0

@MartinWickman你是完全正確的 - 我的評論沒有任何意義。無論如何,我已經給了+1。 – assylias

3

我不認爲有一個開箱即用的數據結構可以做你想做的事情,因爲它看起來有點奇怪。我建議你在LinkedHashSet周圍創建一個包裝器,當你嘗試重新插入它並且再次插入它時,會彈出元素。

+1

*「創建一個**說唱歌手**」*? :) – m0skit0

+0

@ m0skit0 ahahah只是其中一種打字非常有趣的拼寫錯誤謝謝:) –

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財產負責給定元素的所有互動 - 如果你'd請致電getHashMap它也會進行重新排序(因爲Set接口不會在包裝的HashMap上顯示get方法,所以不應該影響您)。

相關問題