получение нужных строк из файла

214
12 февраля 2022, 23:30

Начал изучать Java и передо мной встала такая задача:

Есть текстовый файл txt, в нем хранится запись типа Ф И О, год рождения, оклад(пример:Иванов Иван Иванович, 1973, 20000).

Нужно из текстового файла по заданной фамилии(фамилию ввожу в консоль), вывести сведения о сотруднике, подсчитывая средний оклад всех запрошенных сотрудников. То есть - это будет число, которое суммируется по всем сотрудникам( записей может быть несколько, каждая запись начинается с новой строки).

Как подступиться? Использовать регулярки сложно. Перегонять все в чары или делать дела с массивами строк? Прошу помощи.

Answer 1

Создаете класс объектов по записи. Пишите парсер из строки в объект. Потом читаете построчно файл создавая объекты и добавляя их в коллекцию. А дальше делайте все что нужно с вашими объектами.

Например по вашей строке Иванов Иван Иванович, 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

READ ALSO
Log4j: как сконфигурировать файл?

Log4j: как сконфигурировать файл?

Я подключил к проекту Log4j2, дописал конфигурационный файл

172
После transform элемент размытый

После transform элемент размытый

Почему буква C размытая? Я пытаюсь это адаптировать под разные размеры текста, при --spanNum: 2rem можно заметить, что буква C становится размытым

77
Php Mysql Составить запрос

Php Mysql Составить запрос

всем привет! У меня стоит opencart 23 Когда я захожу в аккаунт в таблице oc_customer есть столбец number с числом например 5 если отдельно вписать

106
Как получить $_GET параметр?

Как получить $_GET параметр?

Есть 2 запроса, один вставляет добавляет комментарий к записям, другой выводит их, каждой записи свои комменты

160