首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >集合实现排序的方式 Comparable & Comparator

集合实现排序的方式 Comparable & Comparator

作者头像
收心
发布2022-01-19 13:37:02
发布2022-01-19 13:37:02
43200
代码可运行
举报
文章被收录于专栏:Java实战博客Java实战博客
运行总次数:0
代码可运行

自然排序 Comparable 比较器排序 Comparator

实现自排序 java.lang.Comparable 接口,重写compareTo() 方法

代码语言:javascript
代码运行次数:0
运行
复制
public class A implements Comparable<A>{
    /**
     * @param o
     * @return  如果结果是正数  就是升序,如果是负数 就是倒序 ,如果结果是 0 那么就认为相同,不排序
     * 对于结果 换个角度思考,this在前 就是升序,this在后 就是降序
     */
    @Override
    public int compareTo(T t) {
        return 0;
    }
}

注意:

当我们添加元素到容器的时候,如果使用的不允许重复的集合例如 TreeSet,在实现Comparable的时候 如果 我们写的条件过少,就会导致compareTo 返回值 = 0,我们的集合就会默认这个元素相同,导致无法添加到集合

案例演示

是先按照年龄升序,如果年龄相同,就按照姓名(中文转成拼音)进行升序

代码语言:javascript
代码运行次数:0
运行
复制
    @Override
    public int compareTo(Student o) {
        int num = this.age - o.age;
        /**
package com.zanglikun.domain;

public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
    }

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

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

    /**
     *
     * @param o
     * @return  如果结果是正数  就是升序,如果是负数 就是倒序 ,如果结果是 0 那么就认为相同,不排序
     * 对于结果 换个角度思考,this在前 就剩升序,this在后 就是降序
     */
    @Override
    public int compareTo(Student o) {
        int num = this.age - o.age;
        /**
         * String.compareTo()的返回值是整型,它是按照顺序字母比较大小,并返回两者ASCII差值
         */
        int num2 = num==0?this.name.compareTo(o.name):num;
        return num2;
    }
}

Test2

代码语言:javascript
代码运行次数:0
运行
复制
    @Test
    public void test002(){
        TreeSet<Student> list = new TreeSet<>();
        list.add(new Student("张大",30));
        list.add(new Student("张二",10));
        list.add(new Student("张三",40));
        list.add(new Student("赵四",30));
        list.add(new Student("赵四",80));
        list.forEach(x ->{
            System.out.println(x);
        });
    }

结果

解释:张 zhang ,赵 zhao 在ASCII 码中 o 大于 n 所以 当年龄都是30的时候 按照升序的话 赵四 排在 张大后面

比较器排序 java.util.Comparator

在创建集合的时候,我们在指定泛型的时候,可以额外追加 排序规则 即 比较器排序,代码如下:o1 > o2 是升序

代码语言:javascript
代码运行次数:0
运行
复制
    @Test
    public void test001() {
        TreeSet<Persion> list = new TreeSet<>(new Comparator<Persion>() {
            @Override
            public int compare(Persion o1, Persion o2) {
                int num = o1.getAge() - o2.getAge();
                /**
                 * String.compareTo()的返回值是整型,它是按照顺序字母比较大小,并返回两者ASCII差值
                 */
                int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
                return num2;
            }
        });
        list.add(new Persion("张大", 30));
        list.add(new Persion("张二", 10));
        list.add(new Persion("张三", 40));
        list.add(new Persion("赵四", 30));
        list.add(new Persion("赵四", 80));

        list.stream().forEach(x -> {
            System.out.println(x);
        });
    }

结果:

OK!

特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现自排序 java.lang.Comparable 接口,重写compareTo() 方法
    • 注意:
    • 案例演示
  • 比较器排序 java.util.Comparator
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档