如何基于ename删除Employee的arrayList中的重复项

时间:2015-08-06 18:18:29

标签: java arraylist collections duplicates

如何基于ename删除Employee的arrayList中的重复项 下面是代码。

package collection;

import java.util.ArrayList;

public class Employee extends ArrayList<Employee> {

    int empno;
    String ename;

    public boolean add(Employee e) {
        // TODO Auto-generated method stub

        Employee e1=(Employee)e;
        if(e1.getEname().equals(this.getEname()))
        {
            return false;
        }

        return super.add(e);
    }

    public int getEmpno() {
        return empno;
    }
    /*public void setEmpno(int empno) {
        this.empno = empno;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }*/

    public String getEname() {
        return ename;
    }

    @Override
    public String toString() {
        return "Employee [empno=" + empno + ", ename=" + ename + "]";
    }

    public Employee(int empno, String ename) {
        super();
        this.empno = empno;
        this.ename = ename;
    }



}

2 个答案:

答案 0 :(得分:1)

extends ArrayList<Employee>是复制粘贴错误吗?如果删除它,您可以使用java.util.Set中的所有员工 - 根据定义不允许重复。

Java 8语法是:

Set<Employee> employeeSet = new TreeSet<>((e1, e2) 
   -> e1.getEname().compareTo(e2.getEname());
employeeSet.addAll(originalEmployeeList);
List<Employee> noDuplicatesEmployeeList = new ArrayList<>(employeeSet);

确保getEname()未返回null

如果不允许使用除列表之外的任何集合,则必须使用嵌套迭代来删除重复项。这在O(n^2)中运行。

for (Employee e1 : l) {
  for (Iterator<Employee > i = l.iterator(); i.hasNext();) {
    Employee e2 = i.next();
    if (e1 != e2 && e1.getEname().equals(e2.getEname())) {
      i.remove();
    }
  }
}

或者 - 如果您被允许重新排序 - 您可以对列表进行排序并在一次迭代中删除重复项。这在O(n*log(n)))中运行。

l.sort((e1, e2) -> e1.getEname().compareTo(e2.getEname());
String cmpEname = null;
for (Iterator<String> i = l.iterator(); i.hasNext();) {
   Employee e = i.next();
   if (e.getEname().equals(cmpEname)) {
     i.remove();
   } else {
     cmpEname = e.getEname();
   }
 }

另请注意,您的问题是如何删除重复项,这与创建不允许重复项的列表不同。您应该与面试官讨论每种方法的好处。

答案 1 :(得分:0)

使用TreeSet是最好的方法,但是如果绝对限于ArrayList,您也可以设计自己的包装列表并添加自己的功能的类。现在只需将员工添加到新阵列中。

 public class MyArray{

   ArrayList<Employee> list;

   public MyArray(){
         list = new ArrayList<Employee>();
   }

   ....just copy all the same functions like
   public add(Employee e){
         list.add(a);
   }
   .....

   public void add(Employee e){
         if(!list.contains(e)) list.add(e);
   }

}