Сортировать строки по фамилии и по порядку

Итак, теперь у меня есть этот код, который сортирует по должности, теперь он также должен быть отсортирован по фамилии и в алфавитном порядке. Мне удалось сделать это по сортировке по должности, а затем дать среднюю зарплату и общую сумму.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class faculty {

    private static final String ASSISTANT = "assistant";
    private static final String ASSOCIATE = "associate";
    private static final String FULL = "full";

    public static void main(String[] args) {
        FileInputStream filestream;
        BufferedReader reader;
        PrintWriter writer;
        String line;

        double totalAssistant = 0;
        double totalAssociate = 0;
        double totalFull = 0;

        try {
            filestream = new FileInputStream("Faculty List.txt");
            reader = new BufferedReader(new InputStreamReader(filestream));
            writer = new PrintWriter("test.txt");

            List<String> assistantList = new ArrayList<String>();
            List<String> associateList = new ArrayList<String>();
            List<String> fullList = new ArrayList<String>();

            while ((line = reader.readLine()) != null) {

                String[] split = line.split(" ");

                double value = Double.parseDouble(split[split.length - 1]);

                String type = split[split.length - 2];

                if (ASSISTANT.equals(type)) {
                    assistantList.add(line);

                } else if (ASSOCIATE.equals(type)) {
                    totalAssociate += value;
                    associateList.add(line);

                } else if (FULL.equals(type)) {
                    totalFull += value;
                    fullList.add(line);
                }
            }

            writeInFileOutput(writer, totalAssistant, assistantList);
            writeInFileOutput(writer, totalAssociate, associateList);
            writeInFileOutput(writer, totalFull, fullList);

            reader.close();

            writer.close();
        } catch (IOException e) {
            System.out.println(e);

        } finally {
            reader = null;
            filestream = null;
            writer = null;
        }

    }

    private static void writeInFileOutput(PrintWriter writer, double totalSalary, List<String> listLines) {
        for (String assistant : listLines) {
            writer.append(assistant).append("\n");
        }

        writer.append("-------\n");
        writer.append("Total Salary:$").append(String.valueOf(totalSalary)).append("\n");
        writer.append("Average Salary: $")
                        .append(String.valueOf(totalSalary / listLines.size())).append(" \n\n");
    }

}

Выход

Pablo Bailey EDUC associate 68757.00
Lonnie Williamson GENS associate 134777.00
Raymond Page EDUC associate 120150.00
Wallace Fitzgerald BUSN associate 40889.00
Juana Robbins SOBL associate 93669.00
Steven Hall SOBL associate 117532.00
Melissa Davis EDUC associate 132186.00
Karla Valdez BUSN associate 16385.00
Melba Luna HLTH associate 70358.00
Sonja Washington HLTH associate 59302.00
Julio Diaz HLTH associate 102641.00
Virgil Briggs PAC associate 40936.00
Terrell Sherman EDUC associate 161595.00
Jorge Scott CSIS associate 124175.00
Tanya Duncan BUSN associate 178894.00
Troy Cannon BUSN associate 58890.00 
------- 
 Total Salary: $3645049.0
 Average Salary: $104144.25714285714 

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

2 ответа

Я бы сделал ваши вещи гораздо более объектно-ориентированными. Итак, это означает: представить нового сотрудника объекта, который имеет несколько полей, как в следующем примере:

public class Employee {
    private String firstName;
    private String familyName;
    private String department;
    private Enum jobPosition;
    private double salary;

    // Put constructor and some getters and setters for your field here
}

public enum JobPosition {
    assistant,
    associate,
    full
}

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

Я бы использовал подход Астры, а затем либо заставил бы Сотрудника реализовать Comparable<Employee>или сделать Comparator<Employee>,

С Comparable<Employee>

public class Employee implements Comparable<Employee> {
    @Override
    public int compareTo(Employee e) {
        int deptResult = this.department.compareToIgnoreCase(e.department);
        if (deptResult != 0) {
            return deptResult;
        }

        familyNameResult = this.familyName.compareToIgnoreCase(e.familyName);
        if (familyNameResult != 0) {
            return familyNameResult;
        }

        return this.firstName.compareToIgnoreCase(e.firstName);
    }
}

С Comparator<Employee>

public class EmployeeComparator implements Comparator<Employee> {
    @Override
    public int compare(Employee e1, Employee e2) {
        int deptResult = e1.getDepartment().compareToIgnoreCase(e2.getDepartment());
        if (deptResult != 0) {
            return deptResult;
        }

        familyNameResult = e1.getFamilyName().compareToIgnoreCase(e2.getFamilyName());
        if (familyNameResult != 0) {
            return familyNameResult;
        }

        return e1.getFirstName().compareToIgnoreCase(e2.getFirstName());
    }
}
Другие вопросы по тегам