我的问题是,我得到一个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