Задача по 8-9 главе Шилдта

Начало тут: Помогите понять и с ошибками

import java.time.Period;
import java.util.ArrayList;
import java.time.LocalDate;
import java.util.Scanner;

public class nearBU {
    public static void main(String[] args) {

        ArrayList<Employee> employees = new ArrayList<>();
        employees.add(new Employee("Иванов", "Иван", "Иваныч", LocalDate.of(2000, 12, 1)));
        employees.add(new Employee("Петров", "Пётр", "Петрович", LocalDate.of(2008, 5, 1)));
        employees.add(new Employee("Сидоров", "Сидр", "Сидрыч", LocalDate.of(2017, 3, 1)));
        employees.add(new Employee("Петров", "Иван", LocalDate.of(2017, 3, 1)));
        employees.add(new Employee("Сидоров", "Пётр", LocalDate.of(2017, 5, 1)));
        employees.add(new Employee("Пидоров", "Сётр", LocalDate.of(2016, 12, 1)));

        employees.stream()
                .filter(employee -> employee.getWorkingExperienceOnDate() >= 3)
                .forEach(System.out::println);
        //верояно что все, что есть в MAIN методе должно быть в классе Database
    }
}


class Employee {
    String surname;
    String name;
    String patronymic;
    private LocalDate jobDate;

    public Employee() {
    }

    public Employee(String surname, String name, LocalDate jobDate) {
        this.surname = surname;
        this.name = name;
        this.patronymic = "";
        this.jobDate = jobDate;
    }

    public Employee(String surname, String name, String patronymic, LocalDate jobDate) {
        this.surname = surname;
        this.name = name;
        this.patronymic = patronymic;
        this.jobDate = jobDate;
    }

    public int getWorkingExperienceOnDate() {
        return Period.between(jobDate, LocalDate.now()).getYears();
    }

    public String getName() {
        return this.name + this.patronymic + this.surname;
    }

    public String getName() {
        return this.name + this.surname;
    }

    @Override
    public String toString() {
        return name + " " + patronymic + " " + surname + ", стаж  : " + getWorkingExperienceOnDate();
    }
}

class Database extends Employee {
    public Database(Employee[] employees) { //зачем это не знаю, но есть в условии задачи

    }

    public findEmployees(String FullNameSubstring) {
        Scanner str = new Scanner(System.in);
        String Str = str.nextLine();
        if Str.equals(FullNameSubstring) return //метод возвращает список работников по соответствию введенной строки 
                                                // подстроке в имени
    }

    public findEmployees(int workingYears) {
        Scanner str = new Scanner(System.in);
        String Str = str.nextLine();
        if this.jobDate == (workingYears) return  //то же самое только по сроку работы
    }

}

Просто не понимаю как делать.


Ответы (1 шт):

Автор решения: OlegFrolOff

Довольно много замечаний по этому коду можно сделать. Я написал рабочую версию, но убрал оттуда ввод из консоли. Если он всё-таки нужен, нужно будет в отдельном методе его реализовать, чтобы можно было использовать Scanner в блоке try с ресурсами. Но поскольку тут всё равно никакое меню реализовано не было, я просто его убрал.

import java.time.LocalDate;
import java.time.Period;
import java.util.ArrayList;
import java.util.List;

public class NearBU {

    public static void main(String[] args) {
        ArrayList<Employee> employees = new ArrayList<>();
        employees.add(new Employee("Иванов", "Иван", "Иваныч", LocalDate.of(2000, 12, 1)));
        employees.add(new Employee("Петров", "Пётр", "Петрович", LocalDate.of(2008, 5, 1)));
        employees.add(new Employee("Сидоров", "Сидр", "Сидрыч", LocalDate.of(2017, 3, 1)));
        employees.add(new Employee("Петров", "Иван", LocalDate.of(2017, 3, 1)));
        employees.add(new Employee("Сидоров", "Пётр", LocalDate.of(2017, 5, 1)));
        employees.add(new Employee("Пидоров", "Сётр", LocalDate.of(2016, 12, 1)));
        Database db = new Database(employees);
        employees.stream()
                .filter(employee -> employee.getWorkingExperienceOnDate() >= 3)
                .forEach(System.out::println);
        //верояно что все, что есть в MAIN методе должно быть в классе Database
        System.out.println();

        db.findEmployees("петров").forEach(System.out::println);
        System.out.println();

        db.findEmployees(3).forEach(System.out::println);
    }
}

class Employee {

    String surname;
    String name;
    String patronymic;
    private LocalDate jobDate;

    public Employee() {
    }

    public Employee(String surname, String name, LocalDate jobDate) {
        this.surname = surname;
        this.name = name;
        this.patronymic = "";
        this.jobDate = jobDate;
    }

    public Employee(String surname, String name, String patronymic, LocalDate jobDate) {
        this.surname = surname;
        this.name = name;
        this.patronymic = patronymic;
        this.jobDate = jobDate;
    }

    public int getWorkingExperienceOnDate() {
        return Period.between(jobDate, LocalDate.now()).getYears();
    }

    //при перегрузке метода число или тип аргументов должны различаться
    //в противном случае необходимо задать другое имя метода
    public String getFullName() {
        return this.name + this.patronymic + this.surname;
    }

    public String getName() {
        return this.name + this.surname;
    }

    @Override
    public String toString() {
        return name + " " + patronymic + " " + surname + ", стаж  : " + getWorkingExperienceOnDate();
    }
}

class Database {

    List<Employee> employees;

//это конструктор, принимающий массив объектов Employee. Нужно их куда-то сохранить
//но раз уж везде используется лист, то и здесь пусть будет лист    
    public Database(List<Employee> employees) { //зачем это не знаю, но есть в условии задачи
        this.employees = employees;
    }


    public List<Employee> findEmployees(String fullNameSubstring) { //не задано возвращаемое значение
                                            //и непонятно, что за fullNameSubstring и откуда будет передаваться
                                            //вероятно это уже готовая строка для поиска и сканер тут не нужен

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

        employees.stream().filter((employee) -> {
            return employee.getFullName().toLowerCase().contains(fullNameSubstring.toLowerCase());
        }).forEach(foundEmployees::add);
        return foundEmployees;//метод возвращает список работников по соответствию введенной строки 
                               // подстроке в имени
    }

    public List<Employee> findEmployees(int workingYears) {
        List<Employee> foundEmployees = new ArrayList<>();

        employees.stream().filter((employee) -> {
            return employee.getWorkingExperienceOnDate()==workingYears;
        }).forEach(foundEmployees::add);
        return foundEmployees;            //то же самое только по сроку работы
    }
}

Также хотел обратить внимание: имена классов должны начинаться с большой буквы, имена переменных и методов с маленькой.

→ Ссылка