сортировка объектов из разных классов Java

1

У меня ниже задачи. Я встал на проблему а). Создавайте классы, которые описывают сотрудников с почасовой оплатой и фиксированной оплатой. Дайте свои предложения относительно отношений между классами. Внедрить метод расчета среднемесячной заработной платы. Для сотрудников с почасовой оплатой используйте следующую формулу: "среднемесячная зарплата = 20,8 * 8 * почасовая ставка", для сотрудников с фиксированной оплатой - "среднемесячная зарплата = фиксированный ежемесячный платеж". Напишите хорошо прокомментированный код для решения следующих задач. A) Сортируйте коллекцию сотрудников в порядке убывания средней заработной платы. В случае равной зарплаты - по названию. Напишите идентификатор, имя и месячную зарплату для всех сотрудников из коллекции. б) Напишите информацию о первых пяти сотрудниках из коллекции (проблема а). c) Напишите идентификатор трех последних сотрудников из коллекции (проблема b). d) Напишите код для чтения и записи коллекции этих объектов из (в) файла. e) Напишите код для обработки неправильного формата входящего файла.

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

import java.util.*;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<EmployeeFixedPayment> coll = new ArrayList<Employee>();

        EmployeeHourlyWage a = new EmployeeHourlyWage("Edd", "Goo", 23, 4);
        EmployeeHourlyWage b = new EmployeeHourlyWage("Tedd", "Foo", 2, 5);
        EmployeeHourlyWage c = new EmployeeHourlyWage("Bob", "Bee", 4, 2);
        EmployeeHourlyWage d = new EmployeeHourlyWage("Kate", "See", 2, 5);
        EmployeeFixedPayment e = new EmployeeFixedPayment("Lisa", "Lee", 7, 500);
        EmployeeFixedPayment f = new EmployeeFixedPayment("Mike", "Ree", 10,
                450);
        EmployeeFixedPayment g = new EmployeeFixedPayment("Izia", "Kurz", 13,
                1000);
        EmployeeFixedPayment j = new EmployeeFixedPayment("Aisha", "Moore", 20,
                800);

        coll.add(a);
        coll.add(b);
        coll.add(c);
        coll.add(d);
        coll.add(e);
        coll.add(f);
        coll.add(g);
        coll.add(j);

        Collections.sort(coll);

        // System.out.println(coll.size());
        for (Employee i : coll) {
            System.out.print(i.secondName + " ");
        }

    }

}

public class Employee {
    String firstName;
    String secondName;
    int id;

    public Employee(String firstName, String secondName,int id){
        this.firstName = firstName;
        this.secondName = secondName;
        this.id = id;
    }


    public void printEmployee(){
        System.out.println(firstName+" "+secondName+" "+id);
    }


    public String getSecondName() {
        return secondName;
    }

    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

}

public class EmployeeFixedPayment extends Employee {
    double fixedPayment;

    public EmployeeFixedPayment(String firstName, String secondName, int id,
            double salary) {
        super(firstName, secondName, id);
        fixedPayment = salary;
    }

    public double getSalary() {
        return fixedPayment;
    }

    public void setSalary(double salary) {
        fixedPayment = salary;
    }
}

public class EmployeeHourlyWage extends Employee {
    Double hourlyWage;

    public EmployeeHourlyWage(String firstName, String secondName, int id, double hourlyRate) {
        super(firstName, secondName, id);
        hourlyWage = 20.8*8*hourlyRate;
    }
    public double getWage(){
        return hourlyWage; 
    }

    public void setWage(double rate) {
        hourlyWage = 20.8*8*rate;
    }

}
  • 2
    Используйте полиморфную коллекцию.
Теги:
class
sorting
collections

2 ответа

0
Лучший ответ

Трюк здесь заключается в том, чтобы вытащить соответствующую информацию (то есть месячную зарплату) до базового класса (Employee), чтобы вы могли написать для нее Comparator.

Итак, сначала примените соответствующий метод до Employee. Поскольку Employee не содержит логики для расчета своей зарплаты, это сделает класс abstract:

public abstract class Employee {
    public abstract double getMonthlySalary();
    // Rest of the members and methods you declared
}

public class EmployeeFixedPayment extends Employee {
    double fixedPayment;

    @Override
    public double getMonthlySalary() {
        return fixedPayment;
    }

    // Rest of the members, ctots, etc. you declared
}

public class EmployeeHourlyWage extends Employee {
    double hourlyWage;

    @Override
    public double getMonthlySalary() {
        return hourlyWage * 20.8 * 8;
    }

    // Rest of the members, ctots, etc. you declared
}

Теперь, когда все Employee раскрывают свою зарплату в согласованном интерфейсе, их можно сортировать, внедряя Comparator:

public class EmployeeComparator implements Comparator<Employee> {
    @Override
    public int compare (Employee e1, Employee e2) {
        // Note we're comparing e2 to e1 to get a descneding effect
        int salaryCompare = Double.compare(e2.getMonthlySalary(), e1.getMonthlySalary());
        if (salaryCompare != 0) {
            return salaryCompare;
        }

        // If the salaries are equal, compare names
        return e1.getName().compareTo(e2.getName());
    }
}

Теперь, чтобы собрать все это вместе, мы просто сортируем List с нашим обычным Comparator:

List<Employee> coll = new ArrayList<>();
Collections.sort(coll, new EmployeeComparator());
  • 0
    это отличная идея использовать абстрактный метод! большое спасибо. все отлично работает!
1

Внедрите интерфейс Comparable для Employee. Таким образом, они упорядочивают правильный путь, когда вы вызываете Collections.sort(coll).

Лично я считаю класс CompareToBuilder полезным для этого.

  • 0
    Хорошо, но я должен реализовать Comparable только для класса Employee или для дочерних классов?
  • 0
    Вы должны реализовать это на Employee .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню