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

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

问题描述:

我有一个叫做员工的类是pojo,并且我创建了这个pojo类型的员工类型的列表。现在我想从列表中删除重复项,请建议有哪些不同的方式来实现的..以不同的方式从列表中删除重复项

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(); 
      } 

} 
} 
+0

...这可能是家庭作业。 – jahroy 2012-08-01 16:20:09

+0

贴在SO上,让它沸腾几分钟。收集答案。 请在发布问题前阅读[常问问题](http://stackoverflow.com/faq) – phadaphunk 2012-08-01 16:25:34

从阵列列表中删除重复的元素,你应该考虑使用哈希集合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); 
+0

不错,我不确定列表中的对象是否需要实现接口和/或等于这个工作,可以你对这些添加了一些澄清? – 2012-08-01 16:24:24

+0

@ G.Bach必须实现equals()和hashCode()才能正常工作 – Qnan 2012-08-01 16:28:47

+0

尽管这可能不会成为问题吗?如果他不知道如何删除重复项,正确地执行hashCode()应该是他的联盟中的一点点,不是吗? – 2012-08-01 16:31:21

三种方式浮现在脑海中瞬间:

  • 迭代通过列表中的每个元素,核对所有其他元素并删除碰撞另一个。运行时间在O(n^2)

  • 对列表进行排序,遍历它,跟踪当前项目A;删除后续项目,直到有一个项目B!= A;一直持续到列表结束。运行时正在排序+迭代,所以O(n日志n)和O(n^2)之间的东西把你的项目放到某种哈希数据结构中,清空你的列表并从哈希中只取一个项目每个哈希值的结构将被重新插入到列表中。运行时间应为O(n),如果做得正确

您可以使用LinkedHashSet来保存元素顺序,这样的事情:

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

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

独特是很重要的,那么使用Set

2.我会建议你使用类HashSet但如果与唯一性一起,排序也很重要,然后用TreeSet实现SortedSet接口,它进一步扩展Collection接口。

3.此外,您可以通过使用Comparator接口在不止一个途径...排序TreeSet