Начал изучать Java и передо мной встала такая задача:
Есть текстовый файл txt
, в нем хранится запись типа Ф И О
, год рождения, оклад(пример:Иванов Иван Иванович
, 1973
, 20000
).
Нужно из текстового файла по заданной фамилии(фамилию ввожу в консоль), вывести сведения о сотруднике, подсчитывая средний оклад всех запрошенных сотрудников. То есть - это будет число, которое суммируется по всем сотрудникам( записей может быть несколько, каждая запись начинается с новой строки).
Как подступиться? Использовать регулярки сложно. Перегонять все в чары или делать дела с массивами строк? Прошу помощи.
Создаете класс объектов по записи. Пишите парсер из строки в объект. Потом читаете построчно файл создавая объекты и добавляя их в коллекцию. А дальше делайте все что нужно с вашими объектами.
Например по вашей строке
Иванов Иван Иванович, 1973, 20000
public class Employee{
private String fullName;
private Integer dob;
private Double salary;
public Employee(String fullName,Integer dob, Double salary){
this.fullName = fullName;
this.dob = dob;
this.salary = salary;
}
//getters and setters
}
Создаете метод который будет парсить вашу строку и создавать из нее объект, можно сделать так:
public class EmployeeFactory{
public static Employee buildEmployee( String strEmployee ){
String[] arr = strEmployee.split( "," );
String fullName = arr[0].trim();
Integer year = Integer.parseInt( arr[1].trim() );
Double salary = Double.parseDouble( arr[2].trim() );
return new Employee( fullName, year, salary);
}
}
Далее пишем сервис. задачами которого будут, чтение файла и формирование коллекции сотрудников и поиск сотрудников по заданной фамилии, например так
public class EmployeeService{
/**
* Загрузка сотрудников из файла
* @param pathToFile путь к файлу со списком сотрудников
* @return список сотрудников
*/
public static List<Employee> loadEmployees( String pathToFile){
List<Employee> employees = null;
try( FileReader inputStream = new FileReader( pathToFile );
BufferedReader bufferedReader = new BufferedReader( inputStream )){
employees = readEmployees(bufferedReader);
}catch( IOException e ){
e.printStackTrace();
}
return employees;
}
private static List<Employee> readEmployees(BufferedReader reader) throws IOException{
List<Employee> employees = new ArrayList<>();
String strEmployee;
//Построчно читаем файл и создаем сотрудников
while((strEmployee = reader.readLine()) != null) {
employees.add(EmployeeFactory.buildEmployee(strEmployee));
}
return employees;
}
/**
* Метод поиска по фамилии в заданном списке
* @param employees общий список сотрудников в котором ищем
* @param example фпмилия сотрудника
* @return список подходящих сотрудников
*/
public static List<Employee> findEmployeesByExample(List<Employee> employees, String example ){
List<Employee> res = new ArrayList<>();
for( Employee emp : employees){
if(emp.getFullName().startsWith( example )){
res.add(emp);
}
}
return res;
}
}
А дальше остается только получать данные с консоли, передавать их в сервис и выводить на печать
public static void main(String[]args){
List<Employee> employees = EmployeeService.loadEmployees( "E:/employees.txt" );
while(true){
System.out.print( "Введите фамилию:" );
Scanner scanner = new Scanner( System.in );
String str = scanner.next();
//для выхода из программы пишем "exit"
if( str.equals( "exit" ) ){
return;
}
List<Employee> employeeListResult = EmployeeService.findEmployeesByExample( employees, str );
Double sumSalary = 0.0;
for( Employee emp : employeeListResult ){
System.out.println( emp.getFullName() + "\t| " + emp.getSalary() );
sumSalary += emp.getSalary();
}
System.out.println( "=========================================" );
System.out.println( "сумма по найденным сотрудникам: " + sumSalary );
System.out.println( "=========================================\n" );
}
}
Если я правильно понял, вы хотели получить что-то вроде этого
Подробнее можно посмотреть на здесь https://github.com/jlk191603/ReadEmployeesFromFile
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Почему буква C размытая? Я пытаюсь это адаптировать под разные размеры текста, при --spanNum: 2rem можно заметить, что буква C становится размытым
всем привет! У меня стоит opencart 23 Когда я захожу в аккаунт в таблице oc_customer есть столбец number с числом например 5 если отдельно вписать
Есть 2 запроса, один вставляет добавляет комментарий к записям, другой выводит их, каждой записи свои комменты