Java 以不同的方式从列表中删除重复项

Java 以不同的方式从列表中删除重复项,java,collections,Java,Collections,我有一个名为employee的类,它是pojo,我已经创建了这个pojo类型的列表,即employee类型的列表。现在我想从列表中删除重复项,请告诉我实现这一点的各种方法 class Emp implements Comparable { String name,job; int salary; public Emp(String n,String j,int sal) { name=n; job=j;

我有一个名为employee的类,它是pojo,我已经创建了这个pojo类型的列表,即employee类型的列表。现在我想从列表中删除重复项,请告诉我实现这一点的各种方法

class Emp implements Comparable
{
      String name,job;
      int salary;
      public Emp(String n,String j,int sal)
      {
         name=n;
         job=j;
         salary=sal;
       }
      public void display()
      {
        System.out.println(name+"\t"+job+"\t"+salary);
       }
      public boolean equals(Object o)
      {
          Emp p=(Emp)o;
          return this.name.equals(p.name)&&this.job.equals(p.job)           &&this.salary==p.salary;
       }
       public int hashCode()
       {
          return name.hashCode()+job.hashCode()+salary;
       }  
       public int compareTo(Object o)
       {
          Emp e=(Emp)o;
          return this.name.compareTo(e.name);
           //return this.job.compareTo(e.job);
          // return this.salary-e.salary;

        }
} 
这是我的员工类型列表

import java.util.*;
class EmpListDemo
{
      public static void main(String arg[])
      {
          ArrayList list=new ArrayList();
          list.add(new Emp("Ram","Trainer",34000));
          list.add(new Emp("Sachin","Programmer",24000));
          list.add(new Emp("Priyanka","Manager",54000));
          list.add(1,new Emp("Ravi","Administrator",44000));
                 list.add(new Emp("Ram","Trainer",34000));
          list.add(new Emp("Anupam","Programmer",34000));
list.add(new Emp("Sachin","Programmer",24000));
          list.add(new Emp("Sachin","Team Leader",54000));
          System.out.println("There are "+list.size()+" elements in the list.");
          System.out.println("Content of list are : ");
          ListIterator itr=list.listIterator();
          while(itr.hasNext())
          {
            Emp e=(Emp)itr.next();  
            e.display();
          }   

}
}

从数组列表中删除重复元素时,应考虑使用哈希集B/C,它们不允许重复。

// Declare your reference variables
ArrayList list = new ArrayList();
HashSet hashSet = new HashSet();

// Put all list elements into hashset
hashSet.addAll(list);
list.clear();
list.addAll(hashSet);

我立刻想到三种方法:

  • 遍历每个元素的列表,对照所有其他元素进行检查,并在发生冲突时删除另一个元素。运行时处于O(n^2)状态

  • 对列表进行排序,遍历列表,跟踪当前项目A;删除后续项目,直到有项目B!=A.继续,直到列表结束。运行时是排序+迭代,所以在O(n logn)和O(n^2)之间

  • 将项目放入某种散列数据结构中,清空列表,并从散列结构中为每个将重新插入列表的散列值只提取一个项目。如果正确执行,则运行时应为O(n)


您可以使用LinkedHashSet保留元素顺序,如下所示:

List list = new ArrayList();
// list initialization

LinkedHashSet set = new LinkedHashSet();
set.addAll(list);
list.clear();
list.addAll(set);

1.唯一性非常重要时,请使用
Set

2.我建议您使用类
哈希集
但是如果除了唯一性,排序也很重要,那么使用
树集
,它实现了
排序集
接口,进一步扩展了
集合
接口


3.此外,您可以通过使用比较器接口对
树集进行多种排序。
。。。这可能是家庭作业。所以,让它煮几分钟。收集答案。请阅读发帖前的问题,我不确定列表中的对象是否需要实现一个接口和/或等效接口才能工作,你能补充一些关于这些的说明吗?@G.Bach必须实现等效()和hashCode()才能工作这难道不是一个问题吗?如果他不知道如何删除重复项,那么正确地实现hashCode()应该有点超出他的能力范围,不是吗?@Keith Randall:我怀疑他的hashCode是否能保证为不同的对象生成不同的哈希。虽然根据hashCode()的规范,这是不必要的,但它可能会破坏消除过程,因为它可能导致没有消除重复项的对象。我只能假设实现是为他的家庭作业提供的,但这并没有改变这样一个事实,即不平等的对象需要为他指定不同的哈希代码。我想应该指出的是,如果这不是家庭作业,实际上应该进入生产代码。@G.Bach:不,试试看。您显然不理解哈希表。