2012-08-01 118 views
-5

我有一個叫做員工的類是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

回答

3

從陣列列表中刪除重複的元素,你應該考慮使用哈希集合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

1

三種方式浮現在腦海中瞬間:

  • 迭代通過列表中的每個元素,覈對所有其他元素並刪除碰撞另一個。運行時間在O(n^2)

  • 對列表進行排序,遍歷它,跟蹤當前項目A;刪除後續項目,直到有一個項目B!= A;一直持續到列表結束。運行時正在排序+迭代,所以O(n日誌n)和O(n^2)之間的東西把你的項目放到某種哈希數據結構中,清空你的列表並從哈希中只取一個項目每個哈希值的結構將被重新插入到列表中。運行時間應爲O(n),如果做得正確

2

您可以使用LinkedHashSet來保存元素順序,這樣的事情:

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

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

獨特是很重要的,那麼使用Set

2.我會建議你使用類HashSet但如果與唯一性一起,排序也很重要,然後用TreeSet實現SortedSet接口,它進一步擴展Collection接口。

3.此外,您可以通過使用Comparator接口在不止一個途徑...排序TreeSet