一、Comparable的使用(重写CompareTo(To)方法)
Student类
package Collection.Set;
import java.util.Objects;
public class Student implements Comparable<Student>{
private int age;
private String name;
public Student() {
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public int compareTo(Student s) {
//return 0;//返回值是0说明元素是重复的,就不会存储我们要存的元素
//return 1;//返回是个正数,就证明s2比s1大,就会将s2存在s1后面,即升序
//return -1;//返回值是个负数,即s2比s1小,降序
int num = this.age - s.age;//this.age即s2, s.age即s1(此写法为升序)
//int num= s.age-this.age;//降序
//次要条件:
int num2 = num == 0 ? this.name.compareTo(s.name) : num;//String本身就实现了Comparable接口,所以可以直接用
return num2;
}
}
测试类
package Collection.Set;
import java.util.TreeSet;
/*
按照年龄从小到大排序,年龄相同时按姓名的字母顺序排
*/
public class TreeSetDemo2 {
public static void main(String[] args) {
TreeSet<Student> s= new TreeSet<>();
Student s1 = new Student(30, "xishi");
Student s2 = new Student(32, "wangzhaojun");
Student s3 = new Student(33, "diaochan");
Student s4 = new Student(31, "yangyuhuan");
Student s5 = new Student(33, "linqingxia");
Student s6 = new Student(33, "linqingxia");
s.add(s1);//s1存储不需要和别人比
s.add(s2);
s.add(s3);
s.add(s4);
s.add(s5);
s.add(s6);
for(Student i : s){
System.out.println(i.getName()+","+i.getAge());
}
}
}
二.比较器Comparator的使用
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(To1,To2)方法
Student02类
代码如下(示例):
package Collection.Set;
import java.util.Objects;
public class Student02 {
private String name;
private int chinese;
private int math;
public Student02() {
}
public Student02(String name, int chinese, int math) {
this.name = name;
this.chinese = chinese;
this.math = math;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getChinese() {
return chinese;
}
public void setChinese(int chinese) {
this.chinese = chinese;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getSum(){
return this.chinese+this.math;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Student02 student02 = (Student02) o;
return chinese == student02.chinese &&
math == student02.math &&
Objects.equals(name, student02.name);
}
@Override
public int hashCode() {
return Objects.hash(name, chinese, math);
}
}
测试类
代码如下(示例):
package Collection.Set;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSet01 {
public static void main(String[] args) {
TreeSet<Student02> s = new TreeSet<>(new Comparator<Student02>() {
@Override
public int compare(Student02 s1, Student02 s2) {
int num=s2.getSum()- s1.getSum();//总分降序排列
int num2=num==0?s1.getChinese()-s2.getChinese():num;//若总分相同,就按语文成绩升序排列
int num3=num2==0?s1.getName().compareTo(s2.getName()):num2;
return num3;
}
});
Student02 s1 =new Student02("张三",98,100);
Student02 s2 =new Student02("李四",95,95);
Student02 s3 =new Student02("王五",100,93);
Student02 s4 =new Student02("陆六",100,97);
Student02 s5 =new Student02("柳七",98,98);
Student02 s6 =new Student02("重八",97,99);
Student02 s7 =new Student02("戚九",97,99);
s.add(s1);
s.add(s2);
s.add(s3);
s.add(s4);
s.add(s5);
s.add(s6);
s.add(s7);
for (Student02 i : s) {
System.out.println(i.getName()+" : "+i.getChinese()+","+i.getMath()+" 总分:"+i.getSum());
}
}
}