题目要求:
向TreeSet集合中加入5个员工的对象,根据员工的年龄(升序)进行排序,若年龄相同,再根据
工龄(降序)来排序,若工龄相同,根据薪水(降序)排序
分析一下? 我想还是不用了,题目已经给的很清晰了。就是一个员工类Employee 一个测试类 一个自己定义的MyComparator类实现了Comparator接口(如果你在Employee类中重写了compareTo方法,那就省略这个类,虽然我不推荐,毕竟后期要求变化的时候不好改)
第一种:(推荐写法)自定义的MyComparator类实现Comparator接口
01 MyComparator类
package cn.ketang.zuoye03;
import java.util.Comparator;
public class MyComparator implements Comparator<Employee> {
@Override
public int compare(Employee s1, Employee s2) {
int num = s1.getAge() - s2.getAge();
//如果年龄相同,那我们比较工龄
int num2 = num == 0 ? (s2.getServiceDays() - s1.getServiceDays()) : num;
//如果工龄又相同,那我们比较薪水
int num3 = num2 == 0 ? (int) (s2.getSalary() - s1.getSalary()) : num2;
//如果薪水也相同,哎,你两不会是同一个人吧,我们在比较下名字。
int num4 = num3 == 0 ? s1.getName().compareTo(s2.getName()) : num3;
return num4;
}
}
02 Employee类
package cn.ketang.zuoye03;
public class Employee {// implements Comparable<Employee>
private String name;
private int age;
private int ServiceDays;
private int salary;
public Employee() {
}
public Employee(String name, int age, int serviceDays, int salary) {
super();
this.name = name;
this.age = age;
ServiceDays = serviceDays;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getServiceDays() {
return ServiceDays;
}
public void setServiceDays(int serviceDays) {
ServiceDays = serviceDays;
}
public double getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "姓名是:" + name + "年龄是:" + age + "工龄是:" + ServiceDays + "薪水是:" + salary;
}
}
03 测试类
package cn.ketang.zuoye03;
import java.util.TreeSet;
public class MyTreeSetTest {
public static void main(String[] args) {
TreeSet<Employee> ts = new TreeSet<Employee>(new MyComparator());
Employee e = new Employee("wujulan", 18, 2, 5555);
Employee e1 = new Employee("wujulan", 18, 3, 5521);
Employee e2 = new Employee("wufa", 18, 3, 5521);// 和e1的区别是仅仅名字不一样
ts.add(new Employee("战三", 18, 2, 5623));//不要问我为什么用匿名对象写
ts.add(new Employee("lisi", 49, 1, 5000));
ts.add(new Employee("wamg2", 19, 3, 6000));
ts.add(e);
ts.add(e);// 不能添加重复的,也填不进去,Mycomparator比较时返回值为0,就不添加,毕竟底层是一个红黑树,每添加一个元素都要从根节点往下比较
ts.add(e1);
ts.add(e2);
for (Employee employee : ts) {
System.out.println(employee);
}
}
}
第二个就是我不推荐的写法,耦合性相较一而言较高
测试类还是测试类,然后在Employee类中实现一个Comparator接口,并重写compareTo方法(反正你不写,编译器也会提示你写的)
直接贴上去Employee类
package cn.ketang.zuoye03;
public class Employee implements Comparable<Employee> {
private String name;
private int age;
private int ServiceDays;
private int salary;
public Employee() {
}
public Employee(String name, int age, int serviceDays, int salary) {
super();
this.name = name;
this.age = age;
ServiceDays = serviceDays;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getServiceDays() {
return ServiceDays;
}
public void setServiceDays(int serviceDays) {
ServiceDays = serviceDays;
}
public double getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "姓名是:" + name + "年龄是:" + age + "工龄是:" + ServiceDays + "薪水是:" + salary;
}
@Override
public int compareTo(Employee s2) {
int num = this.getAge() - s2.getAge();
int num2 = num == 0 ? (s2.getServiceDays() - this.getServiceDays()) : num;
int num3 = num2 == 0 ? (int) (s2.getSalary() - this.getSalary()) : num2;
int num4 = num3 == 0 ? this.getName().compareTo(s2.getName()) : num3;
return num4;
}
}
结果来一波,排版没调,请多担待。
以上,多谢观看。