2014-01-25 114 views
1

我的問題是,我得到一個List<T>從中我需要刪除重複項,並保持排序。刪除重複項,並保持不可修改類的訂購

我知道我可以使用一個HashSet擺脫重複,但它是基於hashcode和類T沒有實現它,我不能修改它。據我所知,我將失去我原來的列表的順序。

我該如何做到這一點?

+0

「重複」在這種情況下意味着什麼?相同的引用(即「==」)還是通過equals()來相等? –

+0

兩個元素在什麼基礎上重複? –

+0

如果可能,我想自己定義平等 – Antoinecoding

回答

1

正如您所指出的,大多數Java數據結構擺脫重複項依賴於hashcode/equals方法。

既然你不能修改的T的代碼,並且希望自己定義的平等,我建議你創建它的包裝,你可以適當地覆蓋hashcode/equals方法:

public class MyT { 
    private final T t; 
    public MyT(T t) { this.t = t; } 
    // + getter 
    // + define hashcode and equals based on t 
} 

之後,您可以只需將您的List<T>轉換爲List<MyT>即可。然後,您可以使用LinkedHashSet<MyT>刪除基於您剛剛實施的hashcode/equals的重複項,並且還會保留原始列表的排序。最後,如果有必要,您可以輕鬆將其轉換回List<T>

1

而且,如果你的列表是小,你不希望處理散列可言,你可以隨時與O去(N^2)解決方案,走幾遍這個單子,尋找重複和刪除它們:

​​