Мне нужно создать карту из списка объектов фермы, используя зарплату из класса Emploee - PullRequest
0 голосов
/ 10 февраля 2019

Это код, который я написал для других вещей, которые мне нужно сделать.Основная проблема в том, что даже с таким большим количеством информации я не могу понять, как это сделать.

Создайте карту из списка ферм, которая будет иметь одинаковый ключ к зарплате и аналогичную стоимость списка сотрудников, имеющих эту зарплату.Отобразите содержимое карты, а для каждого сотрудника - ферму, в которой работает

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 голосов
/ 10 февраля 2019

Map< Integer , List< Employee > >

Похоже, вы хотите построить Map< Integer , List< Employee > >.Клавиша типа Integer (объект, а не примитив int) является окладом. значение - это List сотрудников с этой конкретной зарплатой.

Так что вам нужно создать экземпляр такого Map, вероятно, HashMap или, возможно, SortedMap, например, TreeMap.Затем, когда вы зацикливаете сотрудников, вы видите, была ли их зарплата уже добавлена ​​в качестве ключа к карте.Если нет, добавьте зарплату в качестве ключа и создайте пустой объект List в качестве значения.Добавьте этого конкретного сотрудника в новый список.Если зарплата уже присутствует, восстановите список, добавьте сотрудника.

Чтобы составить отчет по ферме, вам нужно найти, на какую ферму был нанят этот сотрудник.Вы зациклите ключи карты, для каждого ключа получите свой список сотрудников, а затем зациклите этих сотрудников.Для каждого сотрудника выполните цикл всех ферм и получите список сотрудников каждой фермы и посмотрите, есть ли целевой сотрудник в этом списке.Если это так, вы знаете ферму сотрудника в списке на карте.

Один недостаток в вашем коде определяет compareTo для Employee по зарплате.Интуитивно можно сказать, что не пахнет правильно.Вместо этого у вас должен быть идентификатор для каждого сотрудника, как и в большинстве компаний, каждому сотруднику назначается «идентификатор сотрудника».Ради вашего упражнения я бы просто использовал UUID в качестве идентификатора.Добавьте поле члена типа UUID в класс Employee.Определите compareTo, используя этот объект.

Поскольку это, очевидно, домашняя работа, я думаю, что сказал достаточно.Вы должны быть в состоянии понять это, следуя моей прозе.Вы также можете выполнить поиск переполнения стека для множества примеров карт со списком в качестве значения и других подобных проблем.

В реальной работе нас, скорее всего, будут интересовать проблемы параллелизма .Но я предполагаю, что это не было задумано как часть вашего школьного задания.

См. Также советы по стилю кодирования, которые я опубликовал как Комментарии к вопросу.

0 голосов
/ 10 февраля 2019

Вот как вы собираетесь это сделать:

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 к вашему сотруднику и переопределите метод toString () в классе Employee, чтобы вы могли отобразить то, что спрашивают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...