用java在地图中存储员工数据
在一次采访中,该公司被要求设计一个名为用java在地图中存储员工数据,java,Java,在一次采访中,该公司被要求设计一个名为Employee的POJO,该POJO由三个字段组成: 名字 工作 薪水 然后将其存储在一个集合中,然后删除 请按如下所示设计程序 但后来他们让我把它也存储在地图上 现在我的问题是,我应该在map中使用什么作为键,因为在这种情况下,job salary cab的名称也是相同的,所以我应该在hash map中使用什么作为键 class Emp implements Comparable { String name; String job; in
Employee
的POJO,该POJO由三个字段组成:
class Emp
implements Comparable
{
String name;
String job;
int salary;
public Emp(String paramString1, String paramString2, int paramInt)
{
this.name = paramString1;
this.job = paramString2;
this.salary = paramInt;
}
public void display() {
System.out.println(this.name + "\t" + this.job + "\t" + this.salary);
}
public boolean equals(Object paramObject) {
Emp localEmp = (Emp)paramObject;
return (this.name.equals(localEmp.name)) && (this.job.equals(localEmp.job)) && (this.salary == localEmp.salary);
}
public int hashCode() {
return this.name.hashCode() + this.job.hashCode() + this.salary;
}
public int compareTo(Object paramObject) {
Emp localEmp = (Emp)paramObject;
return this.name.compareTo(localEmp.name);
}
}
主要课程是
class EmpHsDemo
{
public static void main(String[] paramArrayOfString)
{
HashSet localHashSet = new HashSet();
localHashSet.add(new Emp("Ram", "Trainer", 34000));
localHashSet.add(new Emp("Ravi", "Administrator", 44000));
localHashSet.add(new Emp("Sachin", "Programmer", 24000));
localHashSet.add(new Emp("Priyanka", "Manager", 54000));
localHashSet.add(new Emp("Anupam", "Programmer", 34000));
localHashSet.add(new Emp("Sachin", "Team Leader", 54000));
System.out.println("There are " + localHashSet.size() + " elements in the set.");
System.out.println("Content of set are : ");
Iterator localIterator = localHashSet.iterator();
while (localIterator.hasNext())
{
localEmp1 = (Emp)localIterator.next();
System.out.print(localEmp1.hashCode() + "\t");
localEmp1.display();
}
Emp localEmp1 = new Emp("Ravi", "Administrator", 44000);
System.out.println("Removing following Emp from the set...");
System.out.print(localEmp1.hashCode() + "\t");
localEmp1.display();
localHashSet.remove(localEmp1);
System.out.println("No. of elements after removal " + localHashSet.size());
Emp localEmp2 = new Emp("Anupam", "Programmer", 34000);
System.out.println("Searching following Emp in the set...");
System.out.print(localEmp2.hashCode() + "\t");
localEmp2.display();
System.out.println("Results of searching is : " + localHashSet.contains(localEmp2));
}
}
您当前的
Emp
类即使在HashSet
中使用,也可能会出现问题,因为两名同名员工可以在同一家公司工作,获得相同的工资,HashSet
将无法区分他们
您应该向
Emp
类添加一些唯一标识符。该唯一成员可以作为映射
中的键。它还可以用于计算hashCode
和equals
(而不是其他属性),因为它唯一地标识员工。您可以按如下方式创建映射
Map<String, Emp> m = new Hashtable<>();
Map m=new Hashtable();
您可以为每个员工分配一个员工id,并将相应的员工对象存储到映射中。实际上,在
HashMap
中键入与HashSet
中的值类似,它们之间没有太大的区别。唯一的问题是什么是您的对象的唯一约束,我会询问面试官,并建议使用名称或添加一些额外的唯一标识符(例如id)。如果是name+salary+job,则应使用它们创建equals
和hashCode
方法。一旦正确定义了这些方法,您就可以毫无疑问地将Employee
类本身用作HashMap键
假设我们决定name+salary+job是我们唯一的标识符,那么我们可以定义hashCode/equals,如下所示:
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
if (job != null ? !job.equals(employee.job) : employee.job != null) return false;
if (name != null ? !name.equals(employee.name) : employee.name != null) return false;
if (salary != null ? !salary.equals(employee.salary) : employee.salary != null) return false;
return true;
}
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (job != null ? job.hashCode() : 0);
result = 31 * result + (salary != null ? salary.hashCode() : 0);
return result;
}
现在我们可以在基于散列的结构中使用Employee作为键。我们可以创建HashSet和HashMap:
List<Employee> employeeList = Arrays.asList(
new Employee("name", "job", 100),
new Employee("name", "job2", 300),
new Employee("name2", "job", 200)
);
Set<Employee> hashSet = new HashSet<Employee>(employeeList);
Map<Employee, Employee> hashMap = new HashMap<Employee, Employee>();
for (Employee employee : employeeList) {
hashMap.put(employee, employee);
}
List employeeList=Arrays.asList(
新员工(“姓名”、“职务”,100),
新员工(“姓名”、“职务2”、300),
新员工(“姓名2”,“职务”,200)
);
Set hashSet=新hashSet(employeeList);
Map hashMap=新hashMap();
用于(员工:员工列表){
hashMap.put(雇员,雇员);
}
进一步来看HashSet的源代码——我们看到它实际上在内部使用了一个HashMap,并将我们的值添加为HashMap的键,每个映射的入口值都是一个虚拟的内部对象,检查构造函数和add方法:
public HashSet() {
map = new HashMap<E,Object>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public HashSet(){
map=新的HashMap();
}
公共布尔加法(E){
返回map.put(e,PRESENT)=null;
}
@udalmik
请尝试使用get(key)获取hashmap中的值,因为类Employee是可变的,所以这是不可能的。您应该使用final关键字使其不可变。我认为所有三个字段的组合字符串可能是“Ram-Trainer-34000”这样的键。我将这样说:您的
比较到是不完整的;它不考虑null
,也不在任何地方使用泛型。现在,你有机会得到一个ClassCastException
,因为你的compareTo
不接受Emp
对象……然后我查了一下,发现原始类型有点……无处不在……嗯,我同意Eran。你应该创建一些唯一的id。这也是数据库中常用的方法。好的,你能不能也展示一下我如何使用employee对象作为键,以使其更清晰请我添加了更多详细信息