Java基础知识--集合框架--Set--TreeSet的排序

一.排序概念:
TreeSet集合底层才有红黑树算法,会对存储的元素默认使用自然排序(从小到大).
注意: 必须保证TreeSet集合中的元素对象是相同的数据类型,否则报错.

二.自然排序:
自然排序(从小到大):
TreeSet调用集合元素的compareTo方法来比较元素的大小关系,然后讲集合元素按照升序排列(从小到大).
注意:要求TreeSet集合中元素得实现java.util.Comparable接口.
在这里插入图片描述
java.util.Comparable接口:可比较的.
覆盖 public int compareTo(Object o)方法,在该方法中编写比较规则.
在该方法中,比较当前对象(this)和参数对象o做比较(严格上说比较的是对象中的数据,比如按照对象的年龄排序).
this > o: 返回正整数. 1
this < o: 返回负整数. -1
this == o: 返回0. 此时认为两个对象为同一个对象.
在TreeSet的自然排序中,认为如果两个对象做比较的compareTo方法返回的是0,则认为是同一个对象.

class Person implements Comparable<Person>{
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Person o) {
        if(this.age>o.age){
            return 1;
        }else if(this.age<o.age){
            return -1;
        }
        return 0;
    }
}
public class TreeSetDemo {
    public static void main(String[] args) {
        TreeSet<Person> set = new TreeSet<>();
        set.add(new Person("赵一",20));
        set.add(new Person("钱二",30));
        set.add(new Person("孙三",10));
        set.add(new Person("李四",15));
        System.out.println(set);
        //[Person{name='孙三', age=10}, Person{name='李四', age=15}, Person{name='赵一', age=20}, Person{name='钱二', age=30}]
    }
}

三.定制排序:
在TreeSet构造器中传递java.lang.Comparator对象.并覆盖public int compare(Object o1, Object o2)再编写比较规则.
在这里插入图片描述

class Person {
     String name;
     Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class TreeSetDemo1 {
    public static void main(String[] args) {
        TreeSet<Person> set = new TreeSet<>(new NameComparator());
        set.add(new Person("陈伊伊",20));
        set.add(new Person("钱二",30));
        set.add(new Person("孙三三",10));
        set.add(new Person("李四四四",15));
        System.out.println(set);
        //[Person{name='李四四四', age=15}, Person{name='孙三三', age=10}, Person{name='陈伊伊', age=20}, Person{name='钱二', age=30}]
    }
}
class NameComparator implements Comparator<Person>{
    @Override
    public int compare(Person o1, Person o2) {
        //先按照名字字数的长短来比较
        if(o1.name.length()>o2.name.length()){
            return -1;
        }else if(o1.name.length()<o2.name.length()){
            return 1;
            //如果名字长短一样,再按照年龄来自然排序
        }else if(o1.age>o2.age){
            return 1;
        }else if(o1.age<o2.age){
            return -1;
        }
        return 0;
    }
}

对于TreeSet集合来说,要么使用自然排序,要么使用定制排序.
判断两个对象是否相等的规则:
自然排序: compareTo方法返回0;
定制排序: compare方法返回0;

发布了99 篇原创文章 · 获赞 2 · 访问量 2604

猜你喜欢

转载自blog.csdn.net/weixin_41588751/article/details/105309851
今日推荐