2014-09-21 145 views
0

我需要在某些數據結構中存儲唯一的對象,但我也需要像ArrayList或普通數組中的索引訪問。也許有一些優雅的方法來做到這一點,而不使用從set到array的convertions,遍歷所有元素,在添加到ArrayList和其他元素時檢查值。 我會很感激任何幫助和建議。隨機訪問正確的數據結構並沒有重複

+3

你能解釋一下爲什麼你需要按索引訪問,索引代表什麼?你可以通過散列集進行順序迭代,所以你不需要隨機訪問/索引。 – 2014-09-21 16:07:32

回答

2

你應該從Apache Commons Collections看看ListOrderedSet

來裝飾另一組,以確保添加的順序被保留,並通過迭代器使用。

如果一個對象第二次添加到該集合中,它將保持在迭代中的原始位置。順序可以通過迭代器或toArray方法從集合中觀察到。

ListOrderedSet還有各種有用的直接方法。這些包括許多來自List的,如get(int),remove(int)和indexOf(int)。該集合的不可修改列表視圖可以通過asList()獲取。

0

製作您自己的課程,其中包含HashSet<T>ArrayList<T>。對於add/append操作,如果元素尚未在集合中,請將其附加到列表將其添加到HashSet。你將使用大約兩倍的內存作爲正常的ArrayList,但你會得到O(1)隨機訪問和包含操作。

+0

爲什麼一倍?它應該只是兩個指向同一對象no的指針,在這種情況下,它將取決於對象的大小,但不會像double那樣差,如果對象很大,可能幾乎相同。 – 2014-09-21 16:12:42

+1

@NirFriedman ArrayList由一個最糟糕的數組支持['1.5n'元素](http://stackoverflow.com/questions/4859873/when-an-arraylist-resizes-itself-how-many-elements -does-IT-ADD)。我還沒有深入研究'HashSet'的實現,但我相信至少會有'1.333n'桶(默認加載因子爲0.75)。無論如何,這個組合數據結構都會使用'O(n)'內存,但估計它是*關於* ArrayList的兩倍內存是合理的。你可能是正確的說對象的大小將主導指針的大小。 – 2014-09-21 16:29:43