Задача по 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; //то же самое только по сроку работы
}
}
Также хотел обратить внимание: имена классов должны начинаться с большой буквы, имена переменных и методов с маленькой.