如何基于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;
}
}
答案 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
。
如果不允许使用除列表之外的任何集合,则必须使用嵌套迭代来删除重复项。这在中运行。
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();
}
}
另请注意,您的问题是如何删除重复项,这与创建不允许重复项的列表不同。您应该与面试官讨论每种方法的好处。
答案 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);
}
}