关于Java中TreeSet的元素有序

一、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());
        }
    }
}

猜你喜欢

转载自blog.csdn.net/wenrenfudi/article/details/113949679
今日推荐