Java 自定义比较器

2023-11-03

Comparator 和 Comparable 相同点

  Comparator 和 Comparable都是java的接口,并且是用来对自定义的class比较大小的。

  对于自定义类如:public class Person{ String name; int age }.
  当我们有这么一个personList,里面包含了person1, person2, persion3…..,我们用Collections.sort( personList )是得不到预期的结果的。这时肯定有人要问,那为什么可以排序一个字符串list呢,如:
StringList{"hello1" , "hello3" , "hello2"} Collections.sort( stringList )
能够得到正确的排序,那是因为String 这个对象已经帮我们实现了 Comparable接口 , 所以Person 如果想排序, 也要实现一个比较器。

Comparator 和 Comparable 的区别

Comparable

  对于Comparable接口来说,它往往是进行比较类需要实现的接口。
该比较器仅包含一个有compareTo()方法,只有一个参数,返回值为int。返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等。

  Comparable 实现在 Person类的内部:
public class Persion implements Comparable {..compareTo() 比较Person的大小..}
  因为已经实现了比较器,那么Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。

Comparator

  对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现。

  Comparator 实现在Person的外部,此时Person类的结构不需要有任何变化,如:
public class Person{ String name; int age }
  然后另外定义一个比较器类
public PersonComparator implements Comparator {..compare() 比较Person的大小..}
  在PersonComparator里面实现了怎么比较两个Person的大小。 所以,用这种方法,当要对一个 personList进行排序的时候,除了要传递personList过去,还需要把PersonComparator传递过去,因为怎么比较Person的大小是在PersonComparator里面实现的,如:Collections.sort( personList , new PersonComparator() )

示例如下:

import java.util.ArrayList;  
import java.util.Collections;  
import java.util.Comparator;  
import java.util.List;  

public class CompareTest {  
    public static void main(String[] args) {  
        List<Student> list = new ArrayList<Student>(10);  
        list.add(new Student(1,"jj"));  
        list.add(new Student(0,"ww"));  
        list.add(new Student(0,"kk"));  
        list.add(new Student(2,"ll"));  
        Collections.sort(list); // 内部比较器:要排序的类实现Comparable接口,可以对自身进行比较  
        System.out.println(list);  

        List<Teacher> t = new ArrayList<Teacher>(10);  
        t.add(new Teacher(1,12));  
        t.add(new Teacher(0,13));  
        t.add(new Teacher(0,14));  
        t.add(new Teacher(2,15));  
        Collections.sort(t,new StudentComparator()); //外部比较器:通过额外的类来实现Comparator接口  
        System.out.println(t);  
    }  
}  

Comparable

class Student implements Comparable {  
    int num;  
    String name;  

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

    @Override  
    public String toString() {  
        return "\r\tnum:"+num+" name:"+name+"\r";  
    }  

    public int compareTo(Object o) {  
        Student tmp = (Student) o;  
        int result = tmp.num > num ? 1 : (tmp.num==num ? 0 : -1);  
        if (result == 0) {  
            result = tmp.name.indexOf(0) > name.indexOf(0) ? 1 : -1;  
        }  
        return result;  
    }  
}  

Comparator

class Teacher{  
    int num;  
    double salary;  

    public Teacher(int num, double salary) {  
        this.num = num;  
        this.salary = salary;  
    }  

    @Override  
    public String toString() {  
        return "\r\tnum:"+num+" salary:"+salary+"\r";  
    }      
}  

class StudentComparator implements Comparator{  

    public int compare(Object o1, Object o2) {  
        Teacher t1 = (Teacher) o1;  
        Teacher t2 = (Teacher) o2;  
        int result = t1.num > t2.num ? 1 : (t1.num == t2.num ? 0 : -1);  
        return result = result == 0 ?(t1.salary<t2.salary ? 1 : -1) : result;  
    }   
}  

转载自:http://blog.csdn.net/u012289441/article/details/45154401?ref=myread

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 自定义比较器 的相关文章

随机推荐

  • 学习笔记-二叉树遍历、查找、删除

    二叉树 树结构出现的原因 二叉树示意图 常用用语 叶子节点 没有子节点的节点 节点的权 节点值 路径 从根节点找到该节点的一条路 树的高度 也就是最大层数 二叉树概念 每个节点最多只能有两个子节点称为二叉树 二叉树的节点分为左子节点和右子节
  • 网格的关键技术问题

    网格的核心观念是一句老话 即 网络就是计算机 这个网络可以大到整个互联网 小到一个家庭网 几年前 当一些国外公司和媒体大炒特炒 网络就是计算机 这类缺乏内容的虚概念的时候 科研人员却在踏踏实实地研究网格的关键技术问题 如果整个互联网就是一台
  • 记录腾讯云服务器解决登录报:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 问题

    起因 我手上有两个腾讯云账号 每个账号下都挂了一台云服务器 之前都是可以通过Mac的 Terminal终端ssh登录 今天发现其中一台报如下错误 首先说下解决方案 看报错信息中有这样一句 这里每个人的hostname不一样需要注意 Add
  • 网安面试题

    导航小助手 如何识别CDN 如何判断靶标站点是windows linux 常见端口 同源策略 TCP和UDP区别 TCP协议的长连接和短连接 SYN FLOOD攻击和CC攻击 Mysql的网站注入 5 0以上和5 0以下的区别 sql注入读
  • 哈希算法(hash)加密解密

    一 哈希算法 hash 加密解密介绍 哈希 英文叫做 hash 哈希函数 hash function 可以把 任意长度的数据 字节串 计算出一个为固定长度的结果数据 我们习惯把 要计算 的数据称之为 源数据 计算后的结果数据称之为 哈希值
  • Redis的geospatial(地理位置)类型的用法

    Redis的geospatial 地理位置 类型的用法 说明 像微信中朋友的定位 附近的人 打车距离等 可以使用Geo在3 2版本之后推出 可以推算地理位置的信息 两地之间的距离 周围的人 底层是Zset 命令同样适用 常用命令 添加 ge
  • 用visio制作机柜服务器,ibm visio 服务器机柜图标

    实例简介 ibm visio 服务器机柜图标 ibm全系列产品visio机柜图标 画机柜平面图的选择 实例截图 核心代码 af108d07 08fb 4638 bf08 372416c35cd2 IBM IBM 1 vss IBM 2 vs
  • 华为手机日历倒计时_华为手机日历怎么设置生日和纪念日提醒?敬业签支持多方式提醒...

    我们在日常生活中除了每天普通的日子外 还有一些对于我们个人来说比较特殊的 有意义的日子 例如亲朋好友的生日 恋爱纪念日 结婚纪念日 以及每月初一十五去上香等 我们将要在一些固定的日期去做指定的事情 如果到时间遗忘做某事 将会造成或大或小的影
  • PID算法控制小车转向

    1 平衡小车转向控制调试 角加速度传感器线加速度计 直立静止时 x和y轴输出为0 z轴为g 存在一定角度时 g会在x和y轴存在分量 Angle Y表示角度 弧度制 Accel X表示重力加速度在x轴的分量 1 平衡小车转向环使用P 比例控制
  • C++:内联函数的优缺点

    内联函数 首先我们阐述一下函数 先从汇编语言的角度看函数的调用 其实就是call和ret的搭配实现了一个函数调用 用下面代码来解释 assume cs code code segment s nop ret main call s mov
  • Android中多USB摄像头解决方案——UVCCamera

    先贴上采用的开源库链接 https github com saki4510t UVCCamera https github com saki4510t OpenCVwithUVC 给USBCamera添加了OpenCV 业余时间捣鼓了下An
  • 支付宝自定义tabbar和小红点及解决bug

    须知 支付宝自定义tabbar 以 我的 界面为例 我有5个tabbar 所以 我的 界面就为第4个 有数字4 的地方换为你对应的tabbar序号 首次运行时 小红点allRedDot会出错 建议将有关allRedDot的地方都先注释 根据
  • 认识NR(四):全网最全最详细5G TypeII 和 Enhanced TypeII码本讲解

    声明 以下内容节选自本人组会ppt 仅供分享 禁止转载 一
  • 使用matlab内存不足,Matlab内存不足问题(Out of memory)

    今天遇到过这个错误 Error using gt horzcat Out of memory Type HELP MEMORY for your options 做算法仿真时 矩阵太大 超出内存了 当信号矩阵缩到可以满足内存时 仿真也没意义
  • discuz知识总结

    Discuz 系统常用函数及变量 常用函数 showmessage 函数 该函数就是我们最常见的页面提示跳转 比如登陆 退出 个人信息修改提交等等 效果演示 函数原型 showmessage message url forward extr
  • VUE搭建项目,配置本地IP地址其他人可访问项目

    1 首先找到config文件夹目录下的 index js文件 Various Dev Server settings host localhost 将localhost进行替换成 0 0 0 0 host 0 0 0 0 can be ov
  • STM32串口结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯、接收不定长数据、DMA

    参考 串口的结构体 重定向printf串口发送stm32等博文 作者 点灯小哥 发布时间 2021 03 06 21 46 33 网址 https blog csdn net weixin 46016743 article details
  • 手机快充方案

    一 各家快充方案及演进 1 高通的QiuckCharge快充 提升电压 发热严重 QC1 0 microUSB接口 5V充电环路阻抗0 32 最大充电电流为 5 4 2 0 32 2 5A 线材限制2A 功率限制10W QC2 0 Micr
  • JavaScript、Lua语言基础、电脑脚本、手机免ROOT免越狱脚本开发免费视频教程

    JavaScript基础教程 https www bilibili com video BV1YW411T7GX Lua基础教程 https www bilibili com video BV1tf4y1V747 一 EasyClick免R
  • Java 自定义比较器

    Comparator 和 Comparable 相同点 Comparator 和 Comparable都是java的接口 并且是用来对自定义的class比较大小的 对于自定义类如 public class Person String nam