2014-01-25 116 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)解决方案,走几遍这个单子,寻找重复和删除它们:

​​