TreeSet的排序规则:自然排序和定制排序

自定义类型存储,如Student和Teacher类型数据等,由于这些自定义的类型的数据没有实现Comparable接口,因此无法直接在TreeSet集合中进行排序操作

解决方案,Java提高了两种TreeSet的排序规则**,自然排序**(默认情况下,TreeSet集合采用自然排序)和定制排序

  • 自然排序

    自然排序要求TreeSet集合中存储的元素所在的类必须实现Comparable接口,并重写comoareTo()方法,然后TreeSet集合就会对该类型使用compareTo()方法进行比较,并默认进行升序排序

package com.sgl;

import java.util.TreeSet;

//定义Teacher类实现Comparable接口
class Teacher implements Comparable {
    String name;
    int age;

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ":" + age;
    }

    @Override
    public int compareTo(Object obj) {
        Teacher s = (Teacher) obj;
        //定义比较方式,先比较年龄age,在比较名称name
        if (this.age - s.age > 0) {
            return 1;
        }
        if (this.age - s.age == 0) {
            return this.name.compareTo(s.name);
        }
        return -1;
    }

}

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

        TreeSet<Object> ts = new TreeSet<>();
        ts.add(new Teacher("Jack", 19));
        ts.add(new Teacher("Rose", 18));
        ts.add(new Teacher("Tom", 19));
        ts.add(new Teacher("Rose", 18));

        System.out.println(ts);
        }
    }

运行结果:

[Rose:18, Jack:19, Tom:19]
  • 定制排序

TreeSet集合中的字符串可以按照长度而不是英文字母来进行排序,可以通过在创建TreeSet集合是就自定义一个比较器来对元素进行定制排序。

按字符串长度排序,如下:

package com.sgl;

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

class MyComparator implements Comparator{
    @Override
    public int compare(Object obj1, Object obj2) {      //定制排序方式
        String s1 = (String) obj1;
        String s2 = (String) obj2;
        int temp = s1.length() - s2.length();
        return temp;
    }
}

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

        //创建集合时,传入Comparator接口实现定制排序规则
        TreeSet<Object> ts = new TreeSet<>(new MyComparator());
        ts.add("Jack");
        ts.add("Helena");
        ts.add("Eve");
        System.out.println(ts);
        //创建集合,使用Lambda表达式定制排序规则
        TreeSet<Object> ts2 = new TreeSet<>((obj1, obj2) -> {
            String s1 = (String) obj1;
            String s2 = (String) obj2;
            return s1.length() - s2.length();
        } );
        ts2.add("Jack");
        ts2.add("Helena");
        ts2.add("Eve");
        System.out.println(ts2);
    }
    }

运行结果:

[Eve, Jack, Helena]
[Eve, Jack, Helena]

简述:

使用TreeSet集合的public TreeSet(Comparator <? super E>comparator)有参构造方法,分别传入Comparable接口实现类MyComparator以及Lambda表达式两种参数方式创建了定制排序规则的TreeSet集合。

注意:在使用TreeSet集合存储数据时**,TreeSet集合会对存入元素进行比较排序**,所以为了保证程序的正常运行,一定保证存入TreeSet集合中的元素是同一中数据类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等慢慢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值