gpt4 book ai didi

java - 如何重写compareto方法来订购员工的工资?

转载 作者:太空宇宙 更新时间:2023-11-04 09:19:01 24 4
gpt4 key购买 nike

我有 2 个类:人员和员工以及一个界面 Human在我的 Person 类中,我有一个 CompareTo 方法 (Human h)它为人的年龄分配 +1、-1 和 0。我类员工=公共(public)类 Employee 扩展 Person 实现 Human =我还有一个compareTo方法,如果年龄相同(用于排序),则需要考虑员工的工资。

我不太确定如何解决这个问题?我能够为 Persons 类制作 compreTo,但我不确定如何在这里对人员和员工进行排序。

感谢您的帮助。

我已经在我的 Employee 类中尝试过这个:

compareTo (Human h) {
Employee e = (Employee)h;

if (super.compareTo(h) == 0 && getSalary ()< e.getSalary())
return -1;
else if (super.compareTo(h) == 0 && getSalary () == e.getSalary())
return 0;
else
return 1;

}

这个可行,但我希望能够使用instanceof来解决这个问题:

     public int compareTo(Human h) {

// TODO Auto-generated method stub

if (getAge() < h.getAge()) {
return -1;
} else if (getAge() > h.getAge()) {
return 1;
} else {
Employee e = (Employee)h;
// age is identical: compare salary
if (getSalary() < e.getSalary()) {
return -1;
} else if (getSalary() > e.getSalary()) {
return 1;
} else {
return 0;
}
}
}

下面我已经证明了我认为解决这个问题所需的代码量:

public interface Human extends Comparable <Human>{
//extends = is a


int getAge();
String getName();

}



public class Person implements Human {
private int age;
private String name;
public int compareTo(Human h) {


//System.out.println(this.age + ". " +h.getAge());
if (h.getAge() > getAge())
return -1;
else if (getAge() == h.getAge())
return 0;
else
return 1;
}

public class Employee extends Person implements Human{


private int salary;
private String employer;

public int compareTo(Human h) {
???
}



public static void main(String[] args) {
ArrayList<Human> p = new ArrayList<Human>();
p.add(new Person("A", 1));
p.add(new Employee("B", 31, "E1", 45000));
p.add(new Person("C", 122));
p.add(new Employee("D", 3, "E2", 54321));
p.add(new Person("E", 21));
p.add(new Employee("F", 31, "E1", 21000));
p.add(new Employee("G", 31, "E1", 38000));
System.out.println(p);
Collections.sort(p);
System.out.println(p); }

这就是我要测试的:

non sorted: [Person:[A, 1], Employee:[B, 31][E1, 45000], Person:[C, 122], Employee:[D, 3][E2, 54321], Person:[E, 21], Employee:[F, 31][E1, 21000], Employee:[G, 31][E1, 38000]]

sorted: [Person:[A, 1], Employee:[D, 3][E2, 54321], Person:[E, 21], Employee:[F, 31][E1, 21000], Employee:[G, 31][E1, 38000], Employee:[B, 31][E1, 45000], Person:[C, 122]]

如有任何帮助,我们将不胜感激。

最佳答案

确保正确的排序; compareTo 方法需要满足 contractComparable 接口(interface)指定。

不幸的是,没有办法扩展Person;重写 Employee 中的 compareTo 来比较工资,同时保留契约(Contract)。

一个简单的解决方案是将比较器传递给Collections.sort();确保集合的所有元素使用相同的比较器实现:

Comparator.comparingInt(Human::getAge).thenComparingInt(h -> h instanceof Employee ? ((Employee) h).getSalary() : 0)

关于java - 如何重写compareto方法来订购员工的工资?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58580674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com