/**
* 存学员成绩
* TreeSet
* 问题:java.lang.ClassCastException: com.qf.treeset.test.Student cannot be cast to java.lang.Comparable异常
* 解决方法:给自定义类添加比较器,有的类系统已自动实现了Comparable接口,这里只针对于自定义类
* 比较器:
* 内部比较器
* 自定义类添加比较器
* 1.自定义类 实现 java.lang.Comparable;
* 2.实现 int compareTo(T o) 方法 比较此对象与比较对象的顺序 制定比较规则
* 匿名内部类
* 1.实例一个集合的时候() new Comparator<T o> 接口
* 2.实现 int compare(T o1,T o2) 方法 比较用来排序的两个参数 制定比较规则
*
* 外部比较器
* 定义一个类 实现比较方法
* 1.自定义一个类 实现 Comparator<T o> 接口
* 2.实现 int compare(T o1,T o2) 方法 比较用来排序的两个参数 制定比较规则
*
*
* 存学员成绩
* TreeSet
* 问题:java.lang.ClassCastException: com.qf.treeset.test.Student cannot be cast to java.lang.Comparable异常
* 解决方法:给自定义类添加比较器,有的类系统已自动实现了Comparable接口,这里只针对于自定义类
* 比较器:
* 内部比较器
* 自定义类添加比较器
* 1.自定义类 实现 java.lang.Comparable;
* 2.实现 int compareTo(T o) 方法 比较此对象与比较对象的顺序 制定比较规则
* 匿名内部类
* 1.实例一个集合的时候() new Comparator<T o> 接口
* 2.实现 int compare(T o1,T o2) 方法 比较用来排序的两个参数 制定比较规则
*
* 外部比较器
* 定义一个类 实现比较方法
* 1.自定义一个类 实现 Comparator<T o> 接口
* 2.实现 int compare(T o1,T o2) 方法 比较用来排序的两个参数 制定比较规则
*
*
*/
1.内部类实现Comparable
public class Worker implements Comparable<Worker>{
public String name;
public int age;
public double salary;
public Worker() {
super();
}
public Worker(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public int compareTo(Worker w) {
// TODO Auto-generated method stub
/*
* 自定义排序规则
*
* */
int num1 = -this.name.compareTo(w.getName());//姓名降序
int num2 = (this.age - w.getAge());//姓名相同,年龄升序
int num3 = -((Double)this.salary).compareTo(w.getSalary());//姓名年龄相同,薪水降序
return num1==0?num2==0?num3:num2:num1;
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<Worker> t = new TreeSet<Worker>();
Worker w1 = new Worker("zhang3", 18, 3000);
Worker w2 = new Worker("zhang3", 19, 3000);
Worker w3 = new Worker("li4", 25, 3500);
Worker w4= new Worker("li4", 25, 3600);
Worker w5 = new Worker("wang5", 22, 3200);
t.add(w1);
t.add(w2);
t.add(w3);
t.add(w4);
t.add(w5);
System.out.println("姓名\t年龄\t薪水");
for(Worker w : t){
System.out.println(w.getName()+"\t"+w.getAge()+"\t"+w.getSalary());
}
}
}
输出结果:
姓名 年龄 薪水
zhang3 18 3000.0
zhang3 19 3000.0
wang5 22 3200.0
li4 25 3600.0
li4 25 3500.0
2.匿名内部类实现接口方法
public class Worker2{
public String name;
public int age;
public double salary;
public Worker2() {
super();
}
public Worker2(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<Worker2> t = new TreeSet<Worker2>(new Comparator<Worker2>() {
@Override
public int compare(Worker2 o1, Worker2 o2) {
/*
* 自定义排序规则
*
* */
int num1 = -o1.getName().compareTo(o2.getName());//姓名降序
int num2 = (o1.getAge() - o2.getAge());//姓名相同,年龄升序
int num3 = -((Double)o1.getSalary()).compareTo(o2.getSalary());//姓名年龄相同,薪水降序
return num1==0?num2==0?num3:num2:num1;
}
});
Worker2 w1 = new Worker2("zhang3", 18, 3000);
Worker2 w2 = new Worker2("zhang3", 19, 3000);
Worker2 w3 = new Worker2("li4", 25, 3500);
Worker2 w4 = new Worker2("li4", 25, 3600);
Worker2 w5 = new Worker2("wang5", 22, 3200);
t.add(w1);
t.add(w2);
t.add(w3);
t.add(w4);
t.add(w5);
System.out.println("姓名\t年龄\t薪水");
for (Worker2 w : t) {
System.out.println(w.getName() + "\t" + w.getAge() + "\t" + w.getSalary());
}
}
}
输出结果:
姓名 年龄 薪水
zhang3 18 3000.0
zhang3 19 3000.0
wang5 22 3200.0
li4 25 3600.0
li4 25 3500.0
3.外部类实现Comparator<T o> 接口
public class WorkerComparable implements Comparator<Worker2> {
@Override
public int compare(Worker2 o1, Worker2 o2) {
// TODO Auto-generated method stub
/*
* 自定义排序规则
*
* */
int num1 = -o1.getName().compareTo(o2.getName());//姓名降序
int num2 = (o1.getAge() - o2.getAge());//姓名相同,年龄升序
int num3 = -((Double)o1.getSalary()).compareTo(o2.getSalary());//姓名年龄相同,薪水降序
return num1==0?num2==0?num3:num2:num1;
}
}
public class Test3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Comparator<Worker2> wc = new WorkerComparable();
TreeSet<Worker2> t = new TreeSet<Worker2>(wc);
Worker2 w1 = new Worker2("zhang3", 18, 3000);
Worker2 w2 = new Worker2("zhang3", 19, 3000);
Worker2 w3 = new Worker2("li4", 25, 3500);
Worker2 w4= new Worker2("li4", 25, 3600);
Worker2 w5 = new Worker2("wang5", 22, 3200);
t.add(w1);
t.add(w2);
t.add(w3);
t.add(w4);
t.add(w5);
System.out.println("姓名\t年龄\t薪水");
for(Worker2 w : t){
System.out.println(w.getName()+"\t"+w.getAge()+"\t"+w.getSalary());
}
}
}
输出结果:
姓名 年龄 薪水
zhang3 18 3000.0
zhang3 19 3000.0
wang5 22 3200.0
li4 25 3600.0
li4 25 3500.0