我有一个班级'员工'它有属性(指定,DoB,员工-I' d,姓名,薪水)。
现在通过以下功能我添加' n' ArrayList' abc'
中的员工对象但是我需要以这样的方式修改它:如果最终用户尝试添加重复的员工(如果两个员工的名称相同则应该被视为重复),则不允许用户这样做。 ..
我怎么能这样做......我想可能使用Map Interface ......但不知道,如何实现
public void addEmployees(int n, ArrayList<Employee> abc) /* 'n' is the number of employees to be added */
{
Scanner sc=new Scanner(System.in);
Employee[] obj = new Employee[n];
for(int i=0;i<n;i++)
{
System.out.println("Enter Employee name:");
String nm=sc.next();
System.out.println("Enter designation:");
String des = sc.next();
System.out.println("Enter employeeI-D:");
int eId = sc.nextInt();
System.out.println("Enter salary:");
double sl = sc.nextDouble();
System.out.println("Enter date-of-birth:");
String dt=sc.next();
obj[i]=new Employee(des,dt,eId,nm,sl);
abc.add(obj[i]);
}
}
答案 0 :(得分:0)
ArrayList
(或任何类型的List
)是此问题的次优数据结构,因为元素查找需要O(n)
时间n
是列表的大小。基本上你需要浏览整个列表并检查该元素是否存在:
public boolean contains(List<Employee> employees, Employee emp) {
for(Employee el : employees) {
if(el.equals(emp)) { // override equals() and hashCode() in Employee
// or use a cutom equals(Employee, Employee) method
return true;
}
}
}
或者使用Java 8语法:
abc.stream().anyMatch(emp -> emp.equals(newEmployee));
如果您可以将该列表更改为Set
,则可以使用contains(Element)方法检查Set
是否已包含给定元素。请注意,此方法使用equals
方法进行检查!
答案 1 :(得分:0)
为了能够检查重复,我们可以将名称存储在一个集合中(设置&lt;字符串&gt;名称),并在每次将员工添加到列表之前进行检查:
Employee[] obj = new Employee[n];
Set<String> names = new HashSet<String>();
...........
...........
if (!names.contains(nm) {
abc.add(obj[i]);
names.add(nm);
}