java: 四器 之 比较器初学

Java集合中排序与比较器机制详解(Comparable vs Comparator) 哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 阅读详情
package GeneIterAdaptReflect.com;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import java.io.*;

/*
 *  第一个:java.lang.Comparable
 *      功能介绍:
 *          此接口强行对实现它的类的对象经行整体排序,又称为自然排序;
 *          小于  等于  大于
 *          -1  0   1
 *      interface Comparable<T>{
 *          int compareTo(T o);
 *      }
 *      实现此接口的  对象列表  或者  数组 可以通过Collection.sort() 或 Arrays.sort()进行自动排序;
 *      实现此接口的  对象  可以用作有序映射(SortedMap<K,V>)中的键或  有序集合(SortedSet<E>)中的元素,无需指定比较器
 *  
 *  第二个:java.util.Comparator
 *      功能介绍:
 *      interface Comparator<T>{
 *          int compare(T o1,T o2);
 *          boolean equals(Object obj);
 *      }
 *  
 *      更常见的是通过匿名内部类来实现;
 *      不 重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不
 *      同的 Comparator 是否强行实施了相同的排序,从而提高性能。 


 * */
/*
 * 需求分析:将学生类按总成绩的排序,并将其在控制台上按从小到大的顺序排序,将从大到小的顺序写在stuScore.txt文件中;
 *  要求:控制台上打印的 通过Comparable接口实现排序
 *      写入文件的通过Compartor接口实现排序
 * */
class Student  implements Comparable<Student>{
    private String name;
    private int mathScore;
    private int engScore;
    private int sum;

    public Student(String name,int mathScore,int engScore){
        this.name = name;
        this.mathScore = mathScore;
        this.engScore = engScore;
        this.sum = mathScore+engScore;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getMathScore() {
        return mathScore;
    }
    public void setMathScore(int score) {
        this.mathScore = score;
    }
    public int getEngScore() {
        return engScore;
    }
    public void setEngScore(int score) {
        this.engScore = score;
    }
    public int getSum() {
        return sum;
    }

    //实现比较器方法:
    public int compareTo(Student stu){
        //如果成绩相等 按 名字的字典顺序排序;
        if(this.getSum() == stu.getSum())
            return this.getName().compareTo(stu.getName());
        //System.out.println(this.getName()+" "+stu.getName()+" :"+(this.score - stu.score));
        return this.getSum() - stu.getSum();
    }

    public String toString(){
        return "姓名: "+this.getName()+"  数学: "+this.getMathScore()+" 英语: "+this.getEngScore()
        +" 总分: "+this.getSum();
    }
}
class MyComparator implements Comparator<Student>{

    public int compare(Student o1, Student o2) {
        // TODO Auto-generated method stub
        if(o1.getSum()==o2.getSum())
            return (o1.getName()).compareTo(o2.getName());
        //实现从大到小排序 
        if(o1.getSum()>o2.getSum())
            return -1;
        else
            return 1;
    }

}
public class ComparatorAndComparable {

    public static void main(String[] args) {
        Student[] stus = new Student[]{new Student("wang",57,89),
                new Student("ping",87,69),
                new Student("song",97,78),
                new Student("li",57,89),
                new Student("zhao",37,49),};

        Arrays.sort(stus);
        //通过匿名内部类来实现名字的字典顺序排序;
        Arrays.sort(stus,new Comparator<Student>(){
            public int compare(Student s1,Student s2){
                if(s1.getSum() == s2.getSum())
                    return s1.getName().compareTo(s2.getName());
                //System.out.println(this.getName()+" "+stu.getName()+" :"+(this.score - stu.score));
                return s1.getSum() - s2.getSum();
            }});
        for(Student s:stus){
            System.out.println(s.toString()+"  ");
        }

        /*输出结果:
         * 姓名: zhao  数学: 37 英语: 49 总分: 86  
         * 姓名: li  数学: 57 英语: 89 总分: 146  
         * 姓名: wang  数学: 57 英语: 89 总分: 146
         * 姓名: ping  数学: 87 英语: 69 总分: 156
         * 姓名: song  数学: 97 英语: 78 总分: 175        
         */

        //按comparable 中定义的方法 comparaTo()进行 按成绩大小排序
        Set<Student> ts = new TreeSet<Student>(new MyComparator());
        Student s1 = new Student("wang",57,89);
        ts.add(s1);
        ts.add(new Student("ping",87,69));
        ts.add(new Student("song",97,78));
        ts.add(new Student("li",57,89));
        ts.add(new Student("zhao",37,49));

        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter(new File("f:\\javatest\\stuScore.txt")));
            for(Student stu:ts){
                bw.write(stu.toString());
                bw.newLine();
                bw.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{

                try {
                    if(bw!=null)
                    bw.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }

    }

}

这里写图片描述

比较器Java:接口Java的“比较器”功能 Java上的Interfaz'Comparator' Descripción Projecto que ejemplifica el uso de la interfazgenérica'Comparator',准许持证人tenjet objetos que la Implementen para poder pasar a ser'Comparadores'。 可以说是不可或缺的军刀对象,可以确定其确凿的可比性。 图解说明 Proyecto realizado con NetBeans。 Puede abrirse con Eclipse。 立即下载

相关推荐

java集合三种比较器(详解)

关于java集合比较器的创建和使用 概述: 在java集合中,TreeSet集合和TreeMap集合底层数据结构都是自平衡二叉树,所以在这两个集合中添加元素的时候会实现自动排序,排序方式为中序排序(即左根右的方式进行排序,详情请见二叉树数据结构,这里不做赘述)。 SUN公司编写源代码的时候已经为我们写好了排序代码,因此在我们输入数据元素后会实现自动排序(这里的数据都是对象,也就是引用类型,不能是基本数据类型),源码中可见底层是调用了compareTo()方法进行了排序(详情请见TreeSet或者TreeMap源码) 如果我们要实现自定义的引用类型排序需要重写排序方法,就必须重写排序方法,有

Java比较器(Comparable和Comparator)

1.Java比较器的使用背景: Java中的对象,正常情况下,只能进行比较:== 或 != 。不能使用 > 或 < 的 但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。 如何实现?使用两个接口中的任何一个:Comparable 或 Comparator 2.自然排序:使用Comparable接口 2.1 说明 1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。 2.像String、

木落 1万+

Android逆向分析

Android 逆向开发是指对已发布的 Android 应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。Android应用 Java编写的,利用Android SDK编译代码,并并且把所有的数据和资源文件打包成一个APK(Android Package)文件这是一个后缀名为.apk的压缩文件,apk文件中包含了一个Anddroid应用程序的所有内容,是Android平台用于安装应用程序的文件。

qq_51598534的博客 6293

java比较器_java比较器的使用详细介绍

在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。本文为大家介绍java比较器的使用。java比较器的使用对于一个实现了Comparable接口的对象,该接口只能实现一次。如果在一个集合里面需要使用id排序,而在另外一个集合里需要按名字排序这时就需要在这个集合里面指定比较器。Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排...

weixin_42228796的博客 1153

YOLOv11 网络结构详解:一文看懂 Backbone、Head、C3k2、SPPF 和 Detect 检测头

在使用 YOLOv11 进行目标检测时,我们经常会接触到或这样的模型配置文件。backbone和head分别是什么意思?ConvC3k2SPPFC2PSA这些模块分别起什么作用?P3/8、P4/16、P5/32 代表什么?为什么最后 Detect 要同时接收 3 个不同尺度的特征图?YOLOv11n、YOLOv11s、YOLOv11m、YOLOv11l、YOLOv11x 的区别在哪里?

learnerYC的博客 1808

TC275-AutoSAR实战:Davinci Cfg多核OS配置与调试技巧

本文详细介绍了在TC275芯片上使用Davinci Cfg工具进行AutoSAR多核操作系统配置的实战步骤与调试技巧。内容涵盖从导入arxml文件的常见“坑”开始,到配置Det、EcuC、创建多核OS实例、关联OS应用、创建任务与设置优先级调度,最后分享了利用Det日志、调试器多核视图及处理核间通信与缓存一致性等关键调试方法,旨在帮助开发者高效完成复杂车载ECU软件集成。

weixin_29219189的博客 488

Java 深入理解排序接口Comparable和比较器接口Comparator

ComparableComparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。 Comparable 接口仅仅只包括一个

BridgeGeorge 2606

STM32 BootLoader 入门教程:从原理到 APP 跳转实现

在 STM32 项目开发中,BootLoader 通常用于实现固件升级、程序引导和应用程序校验。本文从最基础的 BootLoader 原理开始,讲解 STM32 内部 Flash 分区设计、APP 地址偏移、向量表重定位、BootLoader 跳转 APP 的核心代码,以及实际开发中常见的问题。本文适合刚开始接触 STM32 BootLoader、IAP 在线升级、串口升级、OTA 升级的开发者阅读。

lidecong133的博客 1665

java:实现类比较器(附带源码)

java:实现类比较器(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 732

学好超几何分布的核心公式,破解双色球!

彩票本质是概率游戏,不存在"必中公式"科学投注的核心是风险收益比管理长期投注的期望值始终为负(理论回报率约47%-63%)数学维度:运用概率工具优化策略经济维度:控制投注成本在可承受范围人文维度:将彩票视为社会公益的参与方式通过本文构建的数学模型,彩民可以在概率框架内实现更理性的投注决策。但最终能否收获幸运,仍取决于那个永恒的未知数——概率女神的眷顾。一、超几何分布的核心公式。

weixin_44904675的博客 1万+

vue3+ts+elementui-plus二次封装树形表格实现不同层级展开收起的功能

我只定义了三层数据,就只演示展开了三层,还可以多层,自己设置即可。

蜗牛~~ 2602

Java学习笔记——比较器

所谓的比较器指的就是进行大小关系的确定判断。Java里面为了统一比较规则的定义,所以提供有比较器的接口:Comparable接口。 Comparable比较器 如果要实现对象的比较肯定需要有比较气来指定比较的规则,而比较的规则就通过Comparable来实现。 【范例】实现自定义对象数组排序操作 package demo; import java.util.Arrays; public class JavaDemoComparable { public static void main(String

weixin_44336181的博客 252

【WorkBuddy从入门到精通实战教程】使用手册 第 1 章 初识 WorkBuddy

腾讯推出全场景AI办公助手WorkBuddy,突破传统聊天机器人局限,实现从需求理解到结果交付的全流程自动化。该工具通过自然语言交互,可自主规划执行复杂任务,包括文件处理、数据分析、PPT制作等,支持多模型切换和技能扩展。内置权限管控机制确保本地文件操作安全,显著降低人工切换工具的成本,提升职场效率。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 1249

Java 集合入门通关指南(下期):Set 去重、Map 键值对、比较器全搞定

如果存的是 String、Integer 这些 Java 自带的类,不用管 —— 它们已经重写了hashCode()和equals()方法。但如果是你自己写的类(比如 Student),必须手动重写这两个方法,否则 HashSet 无法正确去重!学到这里,Java 集合的核心内容就全掌握了!最后用一张图总结一下,帮大家梳理清楚所有知识点:掌握这些内容,日常开发中的数据存储需求基本都能满足,面试时遇到集合相关的问题也能应对自如。

z479799146的博客 1525

innovus获取mem pin shape box脚本

innovus mem 的pin shae只能通过attitude editor看属性获取其pin shape的box,但是想用脚本处理一定box时,没有别的办法能直接获取box属性。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1108

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JAVA对象比较器Comparator

排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。 如将下列数字进行排序 1,3,5,8,3,6 于是我们得出结果 1,3,3,5,6,8 将下列字母(字符)进行排序 a,i,e,f,w,s 于是我们得出结果 a,

zhanghw_1229的专栏 323

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java基础类库--比较器

内容学习于:edu.aliyun.com 1. 比较器问题引出   所谓的比较器指的就是进行大小关系的确定判断,下面首先来分析一下比较器存在的意义。   如果要进行数组操作,肯定使用java.util.Arrays的操作类完成,这个类里面提供有绝大部分的数组操作支持,同时在这个类里面还提供有一种对象数组的排序支持: public static void sort(Object[] a); 对...

xzzz2020的博客 232

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java中的比较器:掌握排序的艺术

Comparator接口是Java中用于定义对象比较规则的接口。它允许我们在不同的场景下定义对象的自然顺序或者自定义顺序。Comparator提供了几种方法来比较两个对象,其中最常用的是compare方法。

qq_56438516的博客 564

java comparator_Java Comparator比较器实例解析

这篇文章主要介绍了Java Comparator比较器实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下说几点需要注意的,提醒自己即可:以下是单独定义一个比较器的类,实现了Comparator中的compare方法。(要在Main方法外面定义类噢)一定是compare而不是Compare哦package xixixi;import java....

weixin_28948785的博客 180

JAVA对象比较器Comparator接口

JAVA对象比较器Comparator接口 该比较器在TreeSet等地方会使用到。如        TreeSet(Comparator<? super E> comparator) : 构造一个新的空 TreeSet,它根据指定比较器进行排序。 排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序

ml1990s的专栏 1400

Apache Commons IO教程:初学者指南

Apache Commons IO是由Apache Foundation创建和维护的Java库。 它提供了许多类,使开发人员可以轻松地执行常见任务,而无需编写样板代码 ,而对于每个项目都需要一遍又一遍地编写此类库的重要性是巨大的,因为它们已经成熟由经验丰富的开发人员进行维护 ,他们已经考虑了每种可能的情况,或者修复了各种错误。 在此示例中,我们将根据功能所属的org.apache.com...

最佳 Java 编程 1440

JAVA对象比较器Comparato

排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。 如将下列数字进行排序 1,3,5,8,3,6 于是我们得出结果 1,3,3,5,6,8 将下列字母(字符)进行排序 a,i,e,f,w,s 于是我们得出结果 a,e,f,i,s,w 但是我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单...

FzuGsr的专栏 215

java进阶|比较器Comparable和Comparator

一,可能对于java的coder来说,这个点很简单,但对于我来说又是很难,想写这篇文章也是很久了,今天就以自己的理解来看下这两个接口,首先我们先看下Comparable接口的结构图。这个...

qq_35006660的博客 174

Java 对象比较器 comparator 的作用及用法

排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。 如将下列数字进行排序 1,3,5,8,3,6 于是我们得出结果 1,3,3,5,6,8 将下列字母(字符)进行排序 a,i,e,f,w,s 于是我们得出结果 a,e,f,i,s,w 但是我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单

H思xian------博客 8213

TreeMap 排序机制:自然排序 vs 自定义比较器(Comparator)实战

摘要:TreeMap的有序性依赖明确的排序规则,常见两种实现方式:自然排序(键需实现Comparable接口)和自定义比较器(需传入Comparator)。本文通过生产案例揭示了典型错误:未实现Comparable导致ClassCastException、compare逻辑写反导致排序颠倒、未处理null值引发空指针等。关键要点包括:1)基本类型包装类可用自然排序,自定义对象推荐使用比较器;2)compare返回值决定键顺序(负值前移,正值后移);3)高并发场景应使用ConcurrentSkipListMa

m0_67391377的博客 1053
上一篇: java :四器 之 迭代器初学
下一篇: java: 四器 之 生成器初学
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值