карта - Поиск объекта и добавление определенных значений в набор - PullRequest
0 голосов
/ 18 апреля 2020

Исходя из предыдущего вопроса, я хочу перебрать значения объектов на моей карте и, если найдены определенные результаты, добавить их в набор / список, а затем вернуть этот набор / список.

Мой код для класса работодателя:

public class Employer {
    Map<String, NewHire> employee = new HashMap<>();
}

public void addEmployee(String fullName, String age, String location, String JobTitle) {
    NewHire newEmployee = new NewHire(age, location, JobTitle);
    this.employee.put(fullName, newEmployee);
}

Второй код объекта:

public class NewHire {
    private String age;
    private String location;
    private String jobTitle;
}

public NewHire(String aAge, String aLocation, String aJobTitle) {
    this.age = aAge;
     this.location = aLocation;
     this.jobTitle = aJobTitle;
}

И я добавил следующее:

Employer CompanyA = new Employer();
CompanyA.addEmployee("JohnSmith1", "22", "London", "Front Office");
CompanyA.addEmployee("JohnSmith2", "23", "Paris", "Service Desk");
CompanyA.addEmployee("JohnSmith3", "22", "Paris", "Service Desk");
CompanyA.addEmployee("JohnSmith4", "21", "New York", "HR");

Теперь я хочу добавить следующий метод :

public NewHire findAnEmployee(String jobTitle)

Мне нужен метод, который ищет, например, всех сотрудников, работающих в «Службе поддержки», добавляет их в набор и возвращает этот набор. И если никто не найден для этой позиции, верните общее сообщение, в котором говорится, что никто не был найден, который работает там.

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

Использование Stream API:

public Set<NewHire> findAnEmployee(String jobTitle) {
        return employee.values().stream().filter(e -> e.getJobTitle().equals(jobTitle)).collect(Collectors.toSet());
    }
CompanyA.findAnEmployee("Service Desk").stream().forEach(System.out::println);

Я реализую метод getJobTitle и toString в классе NewHire ...

1 голос
/ 18 апреля 2020

Ниже показано, как вы должны реализовать свой метод в Employer классе:

public Set<NewHire> findEmployees(String jobTitle) {
    Set<NewHire> result = new HashSet<NewHire>();
    for (Entry<String, NewHire> entry : employee.entrySet()) {
        NewHire newHire = entry.getValue();
        if (newHire.getJobTitle().equals(jobTitle)) {
            result.add(newHire);
        }
    }
    if (result.size() == 0) {
        System.out.println("Nobody is found for that position");
    }
    return result;
}

Вывод:

Вывод для System.out.println(CompanyA.findEmployees("Service Desk")); будет выглядеть как следует:

[NewHire [age=22, location=Paris, jobTitle=Service Desk], NewHire [age=23, location=Paris, jobTitle=Service Desk]]

Допущения:

  1. Вы уже реализовали public методы получения и установки в классе NewHire.
  2. Вы уже реализовали toString() метод в классе NewHire следующим образом (это автоматически сгенерированный код по Eclipse):
@Override
public String toString() {
    return "NewHire [age=" + age + ", location=" + location + ", jobTitle=" + jobTitle + "]";
}

Дополнительные примечания:

Вы должны следовать Java соглашениям об именах например, переменная CompanyA должна быть названа как companyA.

Имя метод должен быть информативным, например, имя метода, findAnEmployee должно быть изменено на findEmployees, как вы упомянули, What I need the method to do is looks for all Employees that work in "Service Desk" for example, add them to a Set and return that Set..

1 голос
/ 18 апреля 2020

Предложение @JohannesKuhn было хорошим. Вот как это может быть реализовано.

    Set<NewHire> newEmp = findEmployees("Service Desk");
    if (!newEmp.isEmpty()) {
        newEmp.forEach(System.out::println);
    } else {
        System.out.println("No records found for job title");
    }

Печать (используя предложения toString и fullname ниже)

JohnSmith3, 22, Paris, Service Desk
JohnSmith2, 23, Paris, Service Desk

А вот и метод. Он

  • создает поток значений карты (которые являются экземплярами NewHire).
  • фильтрует заголовок задания.
  • И собирает их в набор.

    public Set<NewHire> findEmployees(String jobTitle) {
        return employee.values()
            .stream()
            .filter(emp->emp.jobTitle.equalsIgnoreCase(jobTitle))
             .collect(Collectors.toSet());      
    }

Несколько предложений.

  • Добавление полного имени в класс NewHire.
  • Изменение имени метода на findEmployees
  • Переопределите метод toString NewHire, чтобы вернуть строку соответствующей информации. например,
        public String toString() {
            return name + ", " + age + ", " + location + ", " + jobTitle;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...