【问题标题】:how to remove duplicates in arrayList of Employee based on ename如何根据ename删除员工arrayList中的重复项
【发布时间】:2015-08-06 18:18:28
【问题描述】:

如何根据ename删除员工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;
    }



}

【问题讨论】:

  • 这段代码没有多大意义。为什么员工也是员工列表(然后都是员工列表等)?
  • if(employeeArrayList.contains(ename)) //do stuff
  • kk 我忘了删除你知道吗
  • 你为什么不用Set?
  • 使用 HashSet 而不是 ArrayList

标签: java arraylist collections duplicates


【解决方案1】:

extends ArrayList&lt;Employee&gt; 是复制粘贴错误?如果您删除它,您可以使用将所有员工放入 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

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

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

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

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

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

【讨论】:

  • 我们可以覆盖add方法吗????我不想使用任何其他类型的集合...
  • @manishankarsirisipalli 您可以创建自己的类来组成 ArrayList 并创建自己的添加列表,以首先检查对象是否在列表中。你为什么不想使用另一个集合?。
【解决方案2】:

使用 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);
   }

}

【讨论】:

    猜你喜欢
    • 2019-11-21
    • 2018-05-29
    • 2013-09-04
    • 2012-10-22
    • 2015-12-12
    • 1970-01-01
    • 2011-01-26
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多