自然排序与比较器排序的使用

562 篇文章 79 订阅
订阅专栏

1、自然排序:java.lang.Comparable

Comparable 接口中只提供了一个方法: compareTo(Object obj) ,该方法的返回值是 int 。如果返回值为正数,则表示当前对象(调用该方法的对象)比 obj 对象“大”;反之“小”;如果为零的话,则表示两对象相等。

总结为一句话:实现Comparable,重写 compareTo方法

案列:以TreeMap为例,默认的升序,可以重写自然排序的方法改变原有排序

public static void testComparable(){
        TreeMap<Car,Object> tmp = new TreeMap<Car,Object>();
        tmp.put(new Car(4), "肆");
        tmp.put(new Car(1), "壹");
        tmp.put(new Car(5), "伍");
        tmp.put(new Car(3), "三");
        tmp.put(new Car(2), "贰");
        System.out.println(tmp);
        //结果://{Car [price=5.0]=伍, Car [price=4.0]=肆, Car [price=3.0]=三, Car [price=2.0]=贰, Car [price=1.0]=壹}
    }

//自定义TreeMap排序方法 自然排序

class Car implements Comparable<Car>{
    private double price;
 
    @Override
    public int compareTo(Car o) {
        // TODO Auto-generated method stub
        if(this.price>o.getPrice()){
            return -1;//大的往前排
        }else if(this.price<o.getPrice()){
            return 1;//小的往后排
        }else{
            return 0;
        }
    }
 
    @Override
    public String toString() {
        return "Car [price=" + price + "]";
    }

2、比较器排序:java.util.Comparator

总结为一句话:实现Comparator 接口,重写compare方法

public static void testComparator(){
        //HashMap<Integer,Object> hm = new HashMap<Integer,Object>();
        TreeMap<Integer,Object> tmp = new TreeMap<Integer,Object>(new MyComparatorBigtoSmall());
        tmp.put(4, "肆");
        tmp.put(1, "壹");
        tmp.put(5, "伍");
        tmp.put(3, "三");
        tmp.put(2, "贰");
        //System.out.println(tmp);//默认排序结果:{1=壹, 2=贰, 3=三, 4=肆, 5=伍}
        System.out.println(tmp);//修改为比较器排序(升序){5=伍, 4=肆, 3=三, 2=贰, 1=壹}
    }
 
//自定义TreeMap排序方法    比较器排序    
    class MyComparatorBigtoSmall implements Comparator<Integer>{
 
        @Override
        public int compare(Integer o1, Integer o2) {
            // TODO Auto-generated method stub
            return o2-o1;
        }
    }

自然排序的使用

第一步:使用空参构造创建一个TreeSet集合对象。

第二步:在自定义类中实现一个Comparable接口(注意,接口里要写泛型,而泛型的类型要与集合里的数据类型一致

第三步:重写里面的compareTo()抽象方法。抽象方法里要写排序规则,排序规则如下。

img

/*
 * TreeSet集合来存储Student类型
 * */
public class MyTreeSet2 {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<>();

        Student s1 = new Student("xuyimiao",28);
        Student s2 = new Student("chenxuyuan",27);
        Student s3 = new Student("xiaoyufeng",29);
        Student s4 = new Student("caofengze",28);
        Student s5 = new Student("caofengze",30);


        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        System.out.println(ts);
    }
}
public class Student implements  Comparable<Student>{
    private String name;
    private int age;
    public Student() {
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        //按照对象的年龄进行排序
        //主要判断条件
        int result = this.age - o.age;
        //次要判断条件
        result = result == 0 ? this.name.compareTo(o.getName()) : result;
        return result;
    }
}

比较器排序的使用

img

public class MyTreeSet4 {
    public static void main(String[] args) {
        TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
            @Override
            public int compare(Teacher o1, Teacher o2) {
                //o1表示现在要存入的那个元素
                //o2表示已经存入到集合中的元素
                //主要条件
                int result = o1.getAge() - o2.getAge();
                //次要条件
                result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
                return result;
            }
        });
        Teacher t1 = new Teacher("zhangsan",23);
        Teacher t2 = new Teacher("lisi",22);
        Teacher t3 = new Teacher("wangwu",24);
        Teacher t4 = new Teacher("zhaoliu",24);
        ts.add(t1);
        ts.add(t2);
        ts.add(t3);
        ts.add(t4);
        System.out.println(ts);
    }
}
public class Teacher {
    private String name;
    private int age;

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

该使用哪一种方式?

img

如何理解?

//按长度进行排序
public class MyTreeSet5 {
    public static void main(String[] args) {
        TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //首先比较字符串长度是否相等,短的字符串放左边,长的字符串放右边
                int result = o1.length() - o2.length();
                //如果字符串长度相等,再来比里面的字母。ASCII码小的在左边,ASCII码大的在右边
                result = result == 0 ? o1.compareTo(o2) : result;
                return result;
            }
        });
        //Lambda表达式方法
        /*TreeSet<String> ts = new TreeSet<>((String o1, String o2) -> {
            int result = o1.length() - o2.length();
            result = result == 0 ? o1.compareTo(o2) : result;
            return result;
        });*/
        ts.add("c");
        ts.add("ab");
        ts.add("df");
        ts.add("qwer");

        System.out.println(ts);
    }
}

上面这串代码中,由于Java自带的String类中已经重写了Comparable接口,我们没法再修改。所以只能使用比较排序。

Java自定义比较器实现中文排序
08-24
主要介绍了Java自定义比较器实现中文排序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
第九章-排序
weixin_43288706的博客
04-15 298
第九章-排序 1.学习目标 排序主要关注各种算法的时间复杂度,空间复杂度和应用场景。根据实际的应用场景灵活地选用最优排序算法。 2.概述 1)排序方法的分类 (1)内部排序和外部排序 内部排序:数据量不大,数据在内存,无需与外存交换数据。 外部排序:数据量较大,数据在外存,要将数据分批调入内存来排序,中间结果要及时放入外存,相对复杂。 (2)串行排序和并行排序 串行排序:单处理机,同一时刻比较一对元素。 并行排序:多处理机,同一时刻比较多对元素。 (3)比较排序和基数排序 比较排序:用比较的方法进行排序
比较器(Comparable和Comparator)、自然排序、定制排序java开发模式面试题
最新发布
m0_63174529的博客
03-22 882
Comparable 接口强行对实现它的每个类的对象进行整体排序现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。码讲义、实战项目、讲解视频**如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java
Java基础篇自然排序和定制排序
weixin_44606952的博客
05-13 3729
自然排序和定制排序排序
Java 自然排序比较器排序
qq_32468603的博客
04-22 1486
自然排序比较器排序 自然排序(Comparable) java.lang.Comparable; Comparable是一个抽象类,需要类实现它,才可以使用自然排序。 Comparable 同时是泛型,需要实现它的public int compareTo()方法. 以TreeSet举例,TreeSet有两种使用排序的方法,一种是类型自带自然排序接口Comparable,如:Integer,String等,都是实现了Comparable接口,所以可以直接添加对象进TreeSet中,TreeSet通过他们本身
c mysql自动排序_如何在mysql中实现自然排序
weixin_35457595的博客
01-19 173
熟悉mysql的同学应该清楚,mysql在对字符串做order by排序时是按照字典序进行排序的,但是如果字符串中包含数字的话(我们称这种类型的字符串为alphanumeric),仅按照字典序的排序结果对用户不太友好。我们举个例子,假设我们在mysql中存了一张files表,里面记录了文件的id以及文件的name,表里的数据如下:idname11测试22测试3141测试1251测试161测试20n...
Java如何使用排序
weixin_49149614的博客
05-07 1316
在开发中,需要对一组对象进行排序,是非常常见的需求。排序可以让数据更加有序,便于查找和操作。在Java中,排序可以使用Collections类或Arrays类提供的方法可以通过Comparable自然排序和Comparator定制排序进行实现。
一文真正搞懂Java中的自然排序和定制排序,到底升序还是降序
尚墨1111的博客
07-10 2077
1. 自然排序 自然排序:类实现了java.lang.Comparable接口,重写compareTo()的规则 //这里固定指:o1表示位于前面的对象,o2表示后面的对象,并且表示o1比o2小 o1.compareTo(o2) //升序 Collections.sort(persons, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { //o1比o2小,直接返
java实现中文汉字按首字母排序
热门推荐
小小黑
12-27 2万+
要实现汉字按首字母排序,主要是设置语言环境,如下语句设置语言环境: 这里用到了Collator类,此类实现了Comparator接口,用他的getInstance就可以用指定的语言环境来构造一个Collator对象: 然后用如下语句创建Comparator: Comparator com=Collator.getInstance(java.util.Locale.CHINA);
Java常用类————排序自然排序Comparable;定制排序Comparator
Jrthur_A的博客
06-14 2634
java排序:Comparator接口和Comparable接口的实现
java】深入理解自然排序
m0_71563599的博客
06-04 724
对于int数组,字符串数组来说,他们是很容易比较大小的。你可以自己写一个快排算法,或者直接调用java中的排序接口Arrays.sort()来实现对数组的排序。但如果我们想对对象数组进行排序,该怎么做呢,java身为一个面向对象的语言,自然不会留下这样的缺漏,我们甚至仍旧可以对对象数组调用Arrays.sort()方法,实现排序功能,这就是所谓的java自然排序。 /* 普通数组的排序 */ public static void main(String[] args) { String[] strs
Java自然排序比较器排序详解
09-01
给大家介绍Java中的排序并不是指插入排序、希尔排序、归并排序等具体的排序算法。而是自然排序比较器排序,文中通过实例代码介绍的很详细,有需要的朋友们可以参考借鉴。
TreeSet 不用自然排序自己做比较器
03-07
Comparator<String> com = new Comparator<String>(){ public int compare(String o1,String o2) { return o1.length()-o2.length(); } }; TreeSet ts = new TreeSet(com);... ts.add("string");...
排序比较器
02-04
实现的九大排序算法效率的比较。可以比较百万级的整形数据。希望有助于大家
排序比较器使用
01-28
简单的排序方法使用 Android的开发中我遇到的是象棋电脑下棋时的检索排序
Java自然排序和定制排序
weixin_46615432的博客
11-17 66
你可以为一个类提供多个不同的比较器,每个比较器定义一种排序规则。自然排序需求: 如果类的对象具有天然的顺序,并且这个天然的顺序是你认为最合理的排序方式,那么你可以选择实现 Comparable 接口,并在类内部重写 compareTo 方法。外部排序控制: 如果排序规则不是类的固有属性,或者你不想修改类的源代码,你可以在外部创建一个或多个比较器,然后在排序时传递适当的比较器。默认排序规则: 如果你想为该类的对象提供默认的排序规则,以便在排序方法中使用使用 Comparable 是一个不错的选择。
在elementUI中sort-orders排序,默认为三种,怎么改成两种
milijiangjun的博客
09-17 5646
在 table表单中添加sort-change事件, :sort-orders="[‘ascending’, ‘descending’]" <el-table-column prop="pubDate" label="出版日期" width="150px" sortable='custom' :sort-orders="['ascending', 'descending']" show-overflow-tooltip></el-table-column> 这里 我们这样写 但是有
Comparable(自然排序)和Comparator(定制排序)的用法和总结
weixin_67240798的博客
04-03 964
Comparable是Java里面用于实现排序的接口,String类和封装类进行排序时,会用用到Arrays.sort(对象)进行排序,当然这是因为他们实现了Comparable接口。如果我们日常中自定义了一个类,我们应该实现Comparable接口,重写comparaTo()方法来实现自定义的排序。 例如:自定义一个水果类 package Package4.String类.String常用方法.Comparable与Comparator; public class Fruit imp...
Java 基础篇】Java 自然排序使用 Comparable 接口详解
繁依Fanyi的博客
09-13 4481
自然排序是一种默认的对象排序方式,它是根据对象的内在特征或属性来排序的。例如,对于整数,自然排序是按照数字的大小进行排序;对于字符串,自然排序是按照字母的字典顺序进行排序自然排序通常是最直观和常见的排序方式,它使得对象在集合中以一种有序的方式存储和检索。在 Java 中,自然排序是通过Comparable接口来实现的。这个接口定义了一个compareTo方法,允许对象自己来决定如何与其他对象进行比较。Comparable接口是一个泛型接口,通常在类的声明中使用泛型参数来指定需要比较的对象类型。
自然排序比较器排序
09-01
自然排序比较器排序是两种不同的排序方式。 自然排序是指使用对象的默认排序规则进行排序。在Java中,如果一个类实现了Comparable接口,并重写了compareTo方法,那么这个类的对象就可以通过Collections.sort()或Arrays.sort()等方法进行自然排序自然排序的好处是简单方便,只需要实现Comparable接口并定义好排序规则即可。 比较器排序则是通过实现Comparator接口来进行排序。Comparator接口中有一个compare方法,我们可以根据自己的需求,在该方法中定义排序规则。比较器排序的好处是可以对同一对象进行多种不同方式的排序,同时将比较排序算法和具体的实体类分离,使得排序算法的变化不会影响到实体类的代码。 在使用比较器排序时,我们可以通过传入不同的Comparator对象来实现不同的排序方式。比较器排序的灵活性更高,适用于需要多种不同排序规则的情况。 总结来说,自然排序使用对象的默认排序规则进行排序,而比较器排序则是通过实现Comparator接口来定义排序规则。根据具体的需求,我们可以选择使用自然排序比较器排序来对对象进行排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java自然排序比较器排序详解](https://blog.csdn.net/weixin_58463882/article/details/121493340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • @RequestParam详解 87036
  • 计算机网络—一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块 64346
  • BigDecimal保留两位小数 63182
  • Linux命令 移动/复制文件/目录到指定目录下 52346
  • Java 中判断一个字符串是否包含另外一个字符串的方法 50905

分类专栏

  • Spring 91篇
  • 分布式 12篇
  • SpringBoot 286篇
  • Linux 62篇
  • MySQL 162篇
  • 其他 33篇
  • Java细节 562篇
  • SpringCloud 6篇
  • 计算机网络 28篇
  • MyBatis 39篇
  • Java 74篇
  • 操作系统 5篇
  • Git 10篇
  • 大数据 21篇
  • 云原生 2篇
  • Docker 10篇
  • 流媒体 6篇
  • Redis 29篇
  • 视频 8篇
  • 微服务 13篇
  • Nginx 5篇
  • MyBatis-Plus 32篇
  • 软件工程 2篇
  • Vue 19篇
  • 数据结构与算法 18篇
  • 面试 30篇
  • IOT 11篇
  • Jackson 5篇
  • mina 4篇
  • JVM 9篇
  • SpringMVC 26篇
  • Java注解 8篇
  • Idea 19篇
  • Shiro 2篇
  • Maven 22篇
  • Socket 8篇
  • JSON 9篇
  • UE4 2篇
  • Java8新特性 40篇
  • 多线程 17篇
  • GSON 16篇
  • Excel导出 19篇
  • Http 16篇
  • 软件测试 7篇
  • 接口文档 2篇
  • Java异常 3篇
  • ThreadLocal 7篇
  • MinIO 3篇
  • Dubbo 45篇
  • 抓包工具 2篇
  • 导出Word 3篇
  • Web3 1篇
  • SSM 22篇
  • Postman 7篇
  • JTS 9篇
  • DataWorks 3篇
  • Jenkins 3篇
  • FreeMarker 2篇
  • 支付 5篇
  • BigDecimal 1篇
  • Exception 4篇
  • JNDI 1篇
  • ODPS 1篇
  • MaxCompute 1篇
  • MongoDB 1篇
  • Flask 1篇
  • JavaWeb 1篇
  • JPA 3篇
  • svn 9篇
  • Stream 3篇
  • Chrome浏览器 1篇
  • zip 1篇
  • JS 5篇
  • Windows 2篇
  • Navicat 1篇
  • AWT 3篇
  • Lambda 1篇
  • Zookeeper 1篇
  • OkHttp 1篇
  • 日志 26篇
  • WebSocket 12篇
  • WebService 5篇
  • fastjson 1篇
  • Objects 1篇
  • Java设计模式 7篇
  • HTML 4篇
  • Swagger 4篇
  • NIO 3篇
  • RSA 2篇
  • XSS 3篇
  • Tomcat 8篇
  • JWT 1篇
  • Netty 1篇
  • HashMap 7篇
  • Golang 1篇
  • Servlet 10篇
  • fiddler 2篇
  • JUC 1篇
  • 发送邮件 5篇

最新评论

  • RoundingMode 几个参数详解

    qq_35811265: 这是看英语看的不会说中文了?

  • SpringBoot当中配置日志框架详解(保姆级教程)&日志框架的选择和使用

    sinvon: 良心文章

  • Java导出Word文档的几种方法

    ksc_10: 大佬,如何合并单元格啊

  • Java导出Word文档的几种方法

    ksc_10: 合并单元格你解决了么

  • 在 Java 中加入两个列表的 10 种方法

    冬天vs不冷: 干货满满,实用性强,博主的写作风格简洁明了,让人一目了然。文章内容丰富,涵盖了很多实用的知识点。非常感谢博主的分享,期待博主能够继续输出这样优质的好文。同时也希望可以来我博客指导我一番!

大家在看

  • 自定义Gin日志中间件:深入解析与实现 948
  • ValueError: Tokenizer class Qwen2Tokenizer does not exist or is not currently ported.解决方案 2
  • MSVC 编译工具 cl.exe 入门指南
  • 06.持久化存储 874
  • 力扣每日一题 6/2 283

最新文章

  • 过滤器、拦截器、aop的先后顺序和作用范围&拦截器preHandle(),postHandle(),afterComplation()方法执行顺序
  • Zookeeper概要、协议、应用场景
  • Spring事务七大传播机制与五个隔离级别,嵌套事务
2024
05月 7篇
04月 24篇
03月 39篇
02月 40篇
01月 37篇
2023年398篇
2022年734篇
2021年866篇
2020年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Archie_java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值

深圳SEO优化公司湛江网络推广报价湛江企业网站设计鄂州设计网站推荐南联英文网站建设娄底网站优化排名多少钱乐山网站优化按天扣费多少钱嘉兴百搜标王报价通辽网站制作苏州网站优化排名锦州建设网站公司哈密企业网站设计报价聊城网站改版价格邢台关键词按天扣费哪家好潜江企业网站设计报价荆门网站推广系统价格河池网站设计推荐营口网站推广工具哪家好汉中百姓网标王推广哪家好南昌关键词按天收费价格武汉百度标王价格信阳设计网站珠海网站推广工具报价塔城seo网站推广公司金昌英文网站建设公司大连百度网站优化排名丹竹头百度竞价包年推广公司甘孜外贸网站设计多少钱迪庆企业网站建设价格阿里网站改版哪家好来宾百度标王推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化