我的問題是,我得到一個List<T>
從中我需要刪除重複項,並保持排序。刪除重複項,並保持不可修改類的訂購
我知道我可以使用一個HashSet
擺脫重複,但它是基於hashcode
和類T
沒有實現它,我不能修改它。據我所知,我將失去我原來的列表的順序。
我該如何做到這一點?
我的問題是,我得到一個List<T>
從中我需要刪除重複項,並保持排序。刪除重複項,並保持不可修改類的訂購
我知道我可以使用一個HashSet
擺脫重複,但它是基於hashcode
和類T
沒有實現它,我不能修改它。據我所知,我將失去我原來的列表的順序。
我該如何做到這一點?
正如您所指出的,大多數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>
。
而且,如果你的列表是小,你不希望處理散列可言,你可以隨時與O去(N^2)解決方案,走幾遍這個單子,尋找重複和刪除它們:
「重複」在這種情況下意味着什麼?相同的引用(即「==」)還是通過equals()來相等? –
兩個元素在什麼基礎上重複? –
如果可能,我想自己定義平等 – Antoinecoding