【问题标题】:Removing duplicates from the list with different ways用不同的方式从列表中删除重复项
【发布时间】:2012-08-01 16:13:35
【问题描述】:

我有一个名为employee的类,它是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();
          }   

}
}

【问题讨论】:

  • ...这可能是家庭作业。
  • 在 SO 上发布,让它沸腾几分钟。收集答案。在发布问题之前请阅读F.A.Q

标签: java collections


【解决方案1】:

要从数组列表中删除重复元素,您应该考虑使用哈希集 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);

【讨论】:

  • 很好,我不确定列表中的对象是否需要实现接口和/或 equals 才能使其工作,您能否对此进行一些说明?
  • @G.Bach 必须实现 equals() 和 hashCode() 才能工作
  • 这不会成为问题吗?如果他不知道如何删除重复项,正确实现 hashCode() 应该有点超出他的范围,不是吗?
  • @Keith Randall:我怀疑他的 hashCode 是否能保证为不相等的对象产生不同的哈希值。虽然根据 hashCode() 的规范,这不是必需的,但它可能会破坏消除,因为它可能导致没有重复的对象被消除。我只能假设为他的家庭作业提供了实现,但这并没有改变这样一个事实,即为他的目的需要为不相等的对象分配不同的 hashCodes。我认为应该指出这一点,以防这不是家庭作业并且实际上应该进入生产代码。
  • @G.Bach:不,试试看。你显然不懂哈希表。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    1.独特性很重要时,请使用Set

    2.我会建议你使用HashSet这个类,但是如果除了唯一性,排序也很重要,那么使用TreeSet哪个实现SortedSet接口,进一步扩展Collection接口。

    3. 此外,您可以以多种方式对TreeSet 进行排序...通过使用Comparator 接口。

    【讨论】:

      【解决方案4】:

      立即想到三种方法:

      • 遍历每个元素的列表,检查所有其他元素并在碰撞时删除另一个元素。运行时间为 O(n^2)

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

      • 将您的项目放入某种散列数据结构中,清空您的列表,然后从散列结构中为每个将重新插入到您的列表中的散列值取一个项目。如果正确完成,运行时间应该是 O(n)

      【讨论】:

        猜你喜欢
        • 2014-09-30
        • 2011-10-07
        • 2018-11-23
        • 2011-01-13
        • 2021-04-02
        • 2016-01-28
        相关资源
        最近更新 更多