2013-05-29 95 views
3

我試圖從類與格式列表中提取獨特的元素:麻煩唯一列表元素

[EntityClientPlayerMP['Player989'/228, l='MpServer', x=138.16, y=68.62, z=522.96], EntityCow['Cow'/231, l='MpServer', x=143.63, y=68.00, z=527.50]....] 

這些列表的尺寸通常爲60-100。

我想在目前所使用的方法是

List<Class> uniqueList = new ArrayList<Class>(new HashSet<Class>(fullList)); 

這將返回完全相同的名單,但排序略有不同。任何想法爲什麼?

+0

你是什麼意思「排序有點不同」?你能提供一個例子嗎? – chessbot

+0

你的'Class'類是什麼樣的? (我假設你不是指'java.lang.Class'?) – ruakh

+0

這聽起來很像「_I沒有實現hashCode()和equals()_」的問題。 – jahroy

回答

2

你需要爲equals()hashcode()提供正確實施

2

不要忘了覆蓋每個實體類(why?)的equals()hashCode()方法,否則設置將無法正確判斷當兩個元素相等時。另外,我覺得你的意思是這樣的:

List<EntityClientPlayerMP> uniqueList = 
    new ArrayList<EntityClientPlayerMP>(
     new LinkedHashSet<EntityClientPlayerMP>(fullList)); 

現在在上面的代碼片段類型參數是一個在特定的(如問題出不Class,並根據需要的實際類型替換),並通過使用LinkedHashSet我們保證保留原始列表中的排序。

+0

示例列表不僅包含「EntityClientPlayerMP」,還包含「EntityCow」。推測這些是OP的「Class」類型的子類型。 – Arend

+0

@Arend在這種情況下,你會想要對象。 – user949300

+0

我的意思是,顯然OP已經定義了他自己的類型'Class',其中'EntityClientPlayerMP'和'EntityCow'是子類型。當然,這只是閒散的猜測,並且與問題幾乎沒有關係(對於我沒有什麼補充的答案)。 – Arend

3

它們的排列方式不同,因爲HashSet具有「怪異」排序,基於對象的hashCode。要保留訂購,請使用LinkedHashSet

至於唯一性,設置將使用equals()hashCode(),所以請確保這些都正確實施。有時可以使用的懶惰技巧是使用對象的toString()方法(並在字符串上調用hashCode和equals)。