用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由三个字段组成:

  • 名字
  • 工作
  • 薪水
  • 然后将其存储在一个集合中,然后删除 请按如下所示设计程序

    但后来他们让我把它也存储在地图上 现在我的问题是,我应该在map中使用什么作为键,因为在这种情况下,job salary cab的名称也是相同的,所以我应该在hash map中使用什么作为键

    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对象作为键,以使其更清晰请我添加了更多详细信息