我的问题是,我获得了List<T>
,我需要删除重复内容并保留顺序。
我知道我可以使用HashSet
删除重复项,但它基于hashcode
而类T
没有实现它,我无法修改它。据我所知,我将丢失原始列表的排序。
我怎样才能做到这一点?
答案 0 :(得分:2)
看一下LinkedHashSet课程。
答案 1 :(得分: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>
。
答案 2 :(得分:1)
而且,如果您的列表很小并且您根本不想处理散列,您可以随时使用O(n ^ 2)解决方案并多次遍历列表,查找重复项并删除它们:
public <T> void removeDups(List<T> listWithDups)
{
for(int i = 0; i < listWithDups.size(); i++)
{
T firstItem = listWithDups.get(i);
for(int j = i+1; j < listWithDups.size(); j++)
{
T secondItem = listWithDups.get(j);
if( (firstItem == null && secondItem == null) ||
(firstItem != null && firstItem.equals(secondItem))
)
{
listWithDups.remove(j);
i--;
}
}
}
}