删除重复项并保持不可修改类的排序

时间:2014-01-25 14:50:09

标签: java

我的问题是,我获得了List<T>,我需要删除重复内容并保留顺序。

我知道我可以使用HashSet删除重复项,但它基于hashcode而类T没有实现它,我无法修改它。据我所知,我将丢失原始列表的排序。

我怎样才能做到这一点?

3 个答案:

答案 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--;
          }
       }
    }
 }