我需要使用Emploee类的薪水从农场对象列表中创建地图

时间:2019-02-09 21:19:18

标签: java oop hashmap

这是我到目前为止为其他需要做的事情编写的代码。主要的问题是,即使有这么多的信息,我也无法理解该怎么做。

从服务器场列表中创建一个地图,该地图具有相同的薪水键和具有相同的薪水的雇员列表。显示地图内容,并为每位员工显示正在工作的农场

public class Employee implements Comparable<Employee> {
private String name;
private Integer salary;

public Employee (String name , Integer salary) {
    this.name = name;
    this.salary = salary;
}
public void setName(String name) {
    this.name = name;
}
public String getName() {
    return name;
}
public void setSalary(Integer salary) {
    this.salary = salary;
}
public Integer getSalary() {
    return salary;
}
public String toString() {
    return name + " " + salary;
}
public int compareTo(Employee emp) {
    return this.salary.compareTo(emp.getSalary());
}

}

农家乐

public class Farm {
private String name;
private Integer surface;

List<Employee> emp = new ArrayList<Employee>();


public Farm(String name , Integer surface) {
    this.name =  name;
    this.surface = surface;
}
public void setName(String name) {
    this.name = name;

}
public String getName() {
    return name;
}
public void setSurface(Integer surface) {
    this.surface = surface;
}
public int getSurface () {
    return surface;
}
public String toString() {
    return name + " " + surface;
}
public void makeList(String ename , Integer esalary) {
    this.emp.add(new Employee(ename,esalary));
}
public void getList() {
    for(Employee el : emp)
        System.out.println(el);
}
public Employee getMostPaidEmployee() {
    return Collections.max(emp);
}

}

我主要的人

public static void main(String args[])
{
    List <Farm> FarmList = new ArrayList<Farm>();

    Farm farm1 = new Farm("Tiguana" , 700);
    farm1.makeList("Mihai", 30000);
    farm1.makeList("Vladimir", 4000);
    farm1.makeList("Tusnic", 3000);
    farm1.getList();

    System.out.println(farm1.getMostPaidEmployee());

    Farm farm2 = new Farm("Tipirei" , 800);
    farm2.makeList("Mihai", 30000);
    farm2.makeList("Mihail", 40000);
    farm2.makeList("Armando", 50000);
    farm2.makeList("ASihai", 60000);

    System.out.println(farm2.getMostPaidEmployee());

    FarmList.add(farm2);
    FarmList.add(farm1);


}

2 个答案:

答案 0 :(得分:2)

Map< Integer , List< Employee > >

听起来像您想要构建Map< Integer , List< Employee > >的声音。类型为Integer(对象而不是原始的int)的是工资。 List名具有特定工资的员工。

因此,您需要实例化这样的Map,可能是HashMap,或者也许是SortedMap,例如TreeMap。然后,当您循环播放员工时,您会看到他们的薪水是否已被添加为地图的键。如果不是,则将薪金作为关键字,并创建一个空的List对象作为值。将该特定员工添加到新列表中。如果工资已经存在,请检索列表,然后添加员工。

要按服务器场进行报告,您需要找到雇用该员工的服务器场。您将循环映射的键,为每个键检索其雇员列表,然后循环这些雇员。对于每个员工,循环所有服务器场,并检索每个服务器场的员工列表,并查看目标员工是否在该列表中。如果是这样,您会在地图上的列表中知道该员工的农场。

代码中的一个缺陷是按薪水在compareTo上定义了Employee。凭直觉我们可以分辨出气味不对。相反,您应该在每个员工上都有一个标识符,就像大多数任何公司都为雇用的每个人分配一个“员工ID”一样。为了您的锻炼,我只使用UUID作为ID。将类型为UUID的成员字段添加到您的Employee类中。使用该对象定义compareTo

由于这显然是家庭作业,我想我已经说够了。您应该能够按照我的散文弄清楚这一点。您还可以在Stack Overflow上搜索许多带有列表作为值的地图示例以及其他此类问题。

在实际工作中,我们可能会关注concurrency问题。但是我认为这不是您学校作业的一部分。

另请参阅我作为“问题评论”发布的编码样式提示。

答案 1 :(得分:1)

这就是您要这样做的方式:

Map<Integer, List<Employee>> map = new HashMap<>();
for(Farm f : FarmList){
  for(Employee e : f.emp){
    if(!map.containsKey(e.salary)){
      map.put(e.salary, new ArrayList<>());
    }
    map.get(e.salary).add(e);
  }
}

请确保将FarmName字段添加到您的员工,并覆盖Employee类中的toString()方法,以便您可以显示要求的内容。