Java TreeSet自定义类排序

Java Arrays类、自定义排序、toString

想要使用TreeSet存储自定义类型,需要制定排序规则,具体实现如下。

方法一

让自定义的类(如学生类)实现Comparable接口重写里面的compareTo方法来定制比较规则。

Test.java

import java.util.Set;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        Set<Student> st=new TreeSet<>();

        st.add(new Student("Li Ming",98));
        st.add(new Student("Zhang San",76));
        st.add(new Student("Wang Gang",88));
        st.add(new Student("Xiao Zhang",98));

        System.out.println(st.toString());
    }
}

Studen.java

public class Student implements Comparable<Student>{  //这里要实现Comparable接口
    private String name;
    private int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return this.name+" -> "+this.score;
    }

    //重写比较规则
    @Override
    public int compareTo(Student o) {
//        return o.score-this.score;  //这样写的话虽然是按成绩降序,但是若有成绩相同但姓名不同的,将返回0,认为这是同一个对象被去重
        return o.score-this.score>=0 ? 1:-1;  //只返回1、-1 ,也可以进一步写规则,当成绩相同时按名字、学号排序
    }
}

方法二

TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。

Test.java

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {

        Set<Student> st=new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //方法二:集合自带比较器对象
                //当同时在Student中定义了比较规则时,优先使用定义集合时的规则
                return o1.getScore()-o2.getScore()>=1? 1:-1; //这里是按成绩升序,Student是按成绩降序,可以观察一下
            }
        });

        st.add(new Student("Li Ming",98));
        st.add(new Student("Zhang San",76));
        st.add(new Student("Wang Gang",88));
        st.add(new Student("Xiao Zhang",98));

        System.out.println(st.toString());

    }
}

Studen.java

public class Student implements Comparable<Student>{  //这里要实现Comparable接口
    private String name;
    private int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return this.name+" -> "+this.score;
    }

    //重写比较规则
    @Override
    public int compareTo(Student o) {
//        return o.score-this.score;  //这样写的话虽然是按成绩降序,但是若有成绩相同但姓名不同的,将返回0,认为这是同一个对象被去重
        return o.score-this.score>=0 ? 1:-1;  //只返回1、-1 ,也可以进一步写规则,当成绩相同时按名字、学号排序
    }
}

版权声明:本文为weixin_52341477原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。